Spring - 在ioc容器中装配bean ​

举报
ChillRay 发表于 2020/12/30 00:22:17 2020/12/30
【摘要】 Spring对过去Bean配置文件的冗长性做出了很多重大改进,很多冗长的配置现在有了简介的版本。并提供了多种配置方式,既可以使用其中的一种配置,也可以混合使用多种配置。 Spring容器启动条件: Spring框架的类包都在应用程序的类路径下 应用程序为Spring提供完备的Bean配置信息 Bean的类都已经放到了应用程序的类路径下 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”)


<bean I’d = “userDao” class = “com.baobaotao.anno.UserDao”/>
也有等效于@Component的注解
@RespositoryL用于对DAO实现类进行标注
@Service:用于对Service实现类进行标注
@Controller: 用于对Controller实现类进行标注
使用@Autowired注解,当且仅当有一个对应匹配的Bean的时候,就会被注入到变量中。
通过require属性,可以在require=false时找不到也不会报错

文章来源: zclhit.blog.csdn.net,作者:zclhit_,版权归原作者所有,如需转载,请联系作者。

原文链接:zclhit.blog.csdn.net/article/details/81415148

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。