Spring - 在ioc容器中装配bean
Spring对过去Bean配置文件的冗长性做出了很多重大改进,很多冗长的配置现在有了简介的版本。并提供了多种配置方式,既可以使用其中的一种配置,也可以混合使用多种配置。
Spring容器启动条件:
Spring框架的类包都在应用程序的类路径下
应用程序为Spring提供完备的Bean配置信息
Bean的类都已经放到了应用程序的类路径下
Bean的元数据信息包括:
- Bean的实现类
- Bean的属性信息,资源连接数,用户名密码等
- Bean的依赖关系
- Bean的行为配置
基于xml文件的配置
文件头声明比较复杂,默认命名空间,xsi标准命名空间,自定义命名空间,并为每个命名空间指定Schema文件,以xsd结尾
Schema文档格式定义文件语法:
Spring中装配一个Bean。容器通过getBean(“foo”)即可得到相应的Java Bean
Spring中不能出现相同的id,但是可以出现相同的name,同name后面覆盖前面的。
依赖注入:三种方式,属性注入,构造函数注入,工厂方法注入
属性注入:
最常用,可选择性高,灵活性高
属性注入要求Bean提供默认构造函数及需要注入属性的Setter方法。先调用默认构造器构造对象,再通过反射调用Setter方法进行属性值的注入。
注意property name=“xxx”和Bean内部属性名xxx的一致性。
属性命名规则:变量的前两个字母要么全部大写,要么全部小写。
构造函数注入:通过不同的构造方法属性实现注入。
循环依赖问题:如果两个Bean采用构造函数注入,并且通过构造函数互相入参引用对方,就会发生类似死锁的循环引用问题。
工厂方法配置不经常使用,正在逐渐淡出人们的视野。
字面值:指可以用字符串表示的值,这些值可以通过标签进行注入。默认情况下基本数据类型及其封装类,String类等都可以采用字面值注入的方式。对Boss类引用Car属性并添加依赖关系。
Package com.baobaotao.attr;
Public class Boss{ Private Car car; Public void setCar(Car car){ This.car = car; }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Boss的Bean通过元素引用car Bean,建立起boss对car的依赖。
<bean Id=“car” class=“com.baobaotao.attr.Car”/>
<bean Id=“boss” class=“com.baobaotao.attr.Boss”>
<property name=“car”>
<ref bean = “car”></ref>
</property>
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
元素通过以下三个属性引用容器中其它Bean。
:该属性引用同一容器或者父容器的Bean
:只能引用同一配置文件中定义的Bean
:引用父容器中的Bean
内部Bean类似于java匿名内部类,不会被其他任何Bean引用。
如果需要注入null值,应当为
等同于调用car.setBrand(null)的方法。
级联属性:采用以下注入方式:
<bean Id=“boss3” class=“com.baobaotao.attr.Boss”>
<property name=“car.brand” value=“吉利CT50”/>
</bean>
- 1
- 2
- 3
同时需要在Boss的对象元素内部设置
Private Car car = new Car();
否则将在Spring级联配置的过程中抛出NullValueInNestedPathException
Spring为List,Map,Properties提供了配置方式。
同时也可以采用简化配置方式进行简化配置处理。
使用p命名空间
<xmlns:p = “http://www.springframework.org/schema/p”>
- 1
P:属性名=xxx
自动装配:
autowire=“<自动装配类型>”
四种byName,根据名字
ByType根据属性,比如Car类型
Constructor针对构造函数输入而言的
Autodetect自动装配,自动识别,在byName,byType和construstor
方法注入,使Boss可以每次通过getCar()都返回一个新的Car对象。
Lookup可以实现动态的注入。
replacer可以实现方法替换,一种很魔术的功能。
通过parent属性实现Bean的继承
通过实现依赖,也可以通过depends-on属性来进行依赖管理。
Idref可以用来实现引用
Bean的作用域:singleton,prototype,request,session,globalSession
配置scope=“<作用域类型>”
基于注解的配置。@Component(“userDao”)
和
也有等效于@Component的注解
<bean I’d = “userDao” class = “com.baobaotao.anno.UserDao”/>
@RespositoryL用于对DAO实现类进行标注
@Service:用于对Service实现类进行标注
@Controller: 用于对Controller实现类进行标注
使用@Autowired注解,当且仅当有一个对应匹配的Bean的时候,就会被注入到变量中。
通过require属性,可以在require=false时找不到也不会报错
文章来源: zclhit.blog.csdn.net,作者:zclhit_,版权归原作者所有,如需转载,请联系作者。
原文链接:zclhit.blog.csdn.net/article/details/81415148
- 点赞
- 收藏
- 关注作者
评论(0)