您的位置:首页 > 编程语言 > Java开发

spring对于bean的javaconfig,xml,自动装配三种装配方式实现

2018-03-12 15:12 766 查看
//强依赖通过构造器注入,可选性注入使用属性注入装配bean创建应用对象之间的协作关系叫装配,DI的本质//尽量使用自动配置的机制xml显示装配 <context:component-Scan base-package="包名">//自动装配包内bean的xml语句
隐式bean发现机制和自动装配组件扫描 spring自动发现应用上下文创建的bean自动装配 spring自动满足bean之间的依赖组件扫描@Component注解,自动扫描是不开的@ComponentScan开启,不配置默认扫描与配置类相同的包,spring扫这个包和包下所有子包查找有@Component,然后自动创bean@Runwith(SpringJunit4ClassRunner.class)可以在测试时自动创建应用上下文注解@ContextConfiguration(classes = CDplayerConfig.class)说明需要在CDPlayerConfig类加载配置组件扫描bean命名:将第一个字母小写修改bean命名:@Component("名字"),注解为bean时直接命名还可以使用@Name(“名字”)设置id大部分@name和@Component可以互换@ComponentScan设置基础包:“@ComponentScan("包名"),@ComponentScan(basePackages = "包名"),复数@ComponentScan(basePackages = "包名,包名")因为包名是String但会有not type-safe指定为保重包含的类或接口会比较好@componentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})一样会扫描这些类或者接口所在的包也可创建一个空标记接口,避免要把有些应用代码重构的时候去除自动装配@autowired注解 可用于构造器 会自动在实例化时候传入一个可以设置对应参数的bean,setter方法也可以自动装配,其他方法也会满足方法参数上所说明的依赖,数量会是有几个bean就尽量满足几个如果没有会在应用上下文创建抛出异常,@AutoWired(required=false)则不会抛出异常,没有bean配置就处于未装配状态,如果没有null检查有可能NullpointerException如果有多个满足bean装载则会报出没有明确定义的那个bean注入@Inject也可以注入和@Name与@Component可以互换一样多数情况下@Inject可以和@AutoWired互换@Rulepublic final StandardOutputStreamLog log = new StandardOutputStreamLog();方法中{asserEquals{"识别的System.out.print的输出字符",log.getLog{}}}用于断言识别String是否打印在服务台
spring会在初始化后尽量去满足装配的依赖关系
java显示装配 比xml安全也强大javaConfig 不包括业务逻辑代码,也不会侵入业务逻辑代码@Configuration注解表明这是一个配置类,应该包含在Spring应用上下文如何创建bean的细节 @Bean用于方法会告诉Spring这个方法会返回一个对象,该对象会注册成为Bean,方法体包含了最终参数bean实例的逻辑,ID和注解的方法名一样修改名字@bean(name=“名字”)这样的对于注入的bean我们可以自定义,也可以确定多种实现接口的类进入一个bean,而且跟方法名绑定只要返回对象时接口就可以有多实体类多样性
javaConfig怎么装配:@bean只要注解一个方法,Spring会拦截所有对这个方法的调用并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用 Spring默认的bean都是单例的不会创建第二完全相同的实例,所以Spring会拦截对于方法的调用并确保返回的是Spring创建的bean用@bean不指名创建的bean使用地方,在创建这个bean时能借助这
fcba
个技术将创建这个bean需要的参数自动装配到对应的参数中,方法体就可使用还不用明确引用的@Bean的方法,这是一般引用其他bean最佳选择,因为可以不用声明在同一个配置类中,在方法体中时可以写入任何方法来实现装配xml装配配置文件以<beans>为跟<?xml version = "1.0" encoding = "utf-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmls:xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation ="http://www.springframework.org/shema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context"></beans>声明的是xml模式文件,可借助Spring Tool Suite选择File>New>Spring Bean Configuration File,能创建xml配置文件而且可以选择可用配置命名空间<bean class ="全限定类名">类似于@bean因为没有id所以命名为全限定类名#0,#0是计数加入id=“名字”就可以命名优缺点:不需要创建实例,Spring会默认调用默认构造器,所以没有那么多得自主和自我定义没有变动就是最简单的,而且传入的Class是个String,如果修改了类名,就需要修改配置文件、IDE可以检查xml的合法性xml配置//setter注入,c-命名空间只有构造器注入<bean id="UserManagerImpl" class="com.shuitian.spring.manager.UserManagerImpl">  
        <!-- 使用property注入对象 -->          <property name="userDao" ref="userDao4Mysql"/>      </bean>
<constructor-arg>//构造方法注入<bean id="cdPlayer" class="注入的全类名"><construction-arg ref="bean的id"/></bean>c-命名空间<?xml version="1.0" encoding="UTF-8"><beans xmlns="http://www.springframework.org/schema/beans"xmlns:c="http://www.springframework.org/shcema/c"xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation ="http://www.springframework.org/shema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cdPlayer" class="全类名"c:cd-ref="“参数bean的id"></beans>c为c-命名空间前缀 cd为构造器参数名-ref为注入bean引用的约定需要把调试标志保存在类代码中,所以可以用_0代替cd来确定参数顺序或者单个不用cd直接_
如果只要字面量值装配对象//xml传参<bean id="bean的id" class="全类名"><constructor-arg value ="String值"/></bean>
//c-命名空间<bean id=“bean的id"class="soundsystem.BlankDisc"c:_0="String值"/>
装配集合当集合为null//有个StringList<bean id="' class=""><constructor-arg value="1"><constructor-arg value="2"><constructor-arg><null/></constructor-arg></bean>不为空的时候<bean id="' class=""><constructor-arg value="1"><constructor-arg value="2"><constructor-arg><list><value>1</value><value>2</value><value>3</value><value>4</value></list></constructor-arg></bean>list是construction的子元素value也可以用<ref>来代替换成就是<list><ref bean="1"/></list>还有<set>和<list>效果一致主要看装配时候是要那个c-命名空间无法装配集合xml装配属性<bean id="被注入的id"class="被注入的全类名"><property name="注入的属性名" ref=“注入的id”></bean>setter使用p命名空间进行了装配<bean id=""class=""p:compactDisc-ref ="注入的bean的id"></bean>compactDisc为属性名-ref注入bean引用
p-命名空间和c-命名空间都不可以装载集合p命名空间加载String<bean id=""class=""p:title=""p:artist=""><property name = "tracks"><list><value>""</value><value>""</value><value>""</value></list></property></bean>
util-命名空间简化BlankDiscbean<>xml version="1.0" encoding="utf-8"?><beans xmlns = "http://www.springframework.org/schema/bean"xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/shcema/p"xmlns:util="http://www.springframework.org/shcema/util"xsi:schemaLocation ="http://www.springframework.org/shema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"http:///www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util/xsd"></bean>
借助util命名空间可以将list拿出bean单独把声明到bean中,单独创建一个列表bean,然后注入就好了<util:list id="列表id"><value></value><value></value><value></value></util:list>
<bean id="被注入的id"class = "被注入的全类名"p:title =""p:artist = ""p:tracks-ref =""/>
util有<util:constant> 引用某个类型public static域,并将其暴露为bean<util:lis><util:map><util:set <util:properties> 创建java.util.properties类型的bean//java.util.properties是键值对的形式存储<util:property-path> 引用一个bean属性, 暴露其为bean
两个bean分开不同类后@Import注解会导入bean在配置类中@import(CDconfig.class)
javaconfig引用xml当其中一个bean在xml里面,将两个bean装载到一起@importResource注解@Configuration@import("第一个装载bean1的类")@ImportResource("classpaht:xml文件路径")public class SoundSystemConfig{}两个bean都会装载进来,因为CDplayer带有@Bean注解的方法接受一个compactDisc作为参数,因此BlankDisc将会装配进来,此时与他是通过xml配置的没有任何关系,但如果没有也会装载
https://www.cnblogs.com/bigdataZJ/p/SpringInAction3.htmlxml配置引用另外一个xml配置<bean class="soundsystem.CDConfig"><import resource="另外一个配置文件地址"/>xml配置中引用javaconfig<bean class ="java装载bean的全类名"/><bean id="" class=""c:cd-ref=""/>
更多用来众合的xml<bean class=""/><import resource=""/><context:component-scan> 也可以开启自扫
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring
相关文章推荐