spring01
spring重新整理归纳一 装配bean
|
|
线索Cues
|
笔记Notes
|
|
|
为什么方法名字写错之后,但是使用Autowired注解还是可以注入成功呢?
|
spring作为一个java学习路径上必须重点掌握的框架,以前一直都在使用,但是从未真正归纳总结过。所以趁着读书期间,再一次完整的学习。
spring刚刚开始的版本使用了xml注解的方式,但是现在基本上使用的是注解的形式。
第一种注解方式
首先总结spring最重要的功能,bean的自动装配,spring这部分的功能集中在spring-context包中。在pom文件中导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
然后使用注解 @Component ,被注解的类在之后组件扫描中自动创建,在这之后我们就要定义组件扫描类,@ComponentScan 注解的类会寻找和注解类相同包下的带有@Component的类。这样就可以使用@Autowired注解自动寻找相对应的Bean。
第二种JavaConfig方式
注解的方式非常实用,但只适合自己的编写的类,如果引用其他程序的第三方类,注解并不适用,所以可以用JavaConfig的方式,首先编写配置类,这个配置和别的java类并没有什么区别,只需要加上@Configuation注解就可以标明这是注解类,然后通过编写java代码的方式新建类,如下图:
@Bean添加的id为方法名 表名这个方法返回的是一个对象
第三种XML配置Bean
xml是spring最原始的一种配置方式,重新学习一遍加深一下印象。首先在项目里新建一个spring配置文件,xml上方XML模式(xsd)文件,这些都是定义了xml元素。根元素是<Beans>。
在项目下新建Bean的配置,id定义了创建Bean的名字,class定义了具体的包路径:
<bean id="sgtPoppers" class="com.qunincey.SgtPoppers"/>
1.构造器注入配置
在这里配置的元素就有两种了一种是使用<constructor-arg>元素
<bean id="cdPlayer" class="com.qunincey.CDPlayer">
<constructor-arg ref="sgtPoppers"/>
</bean>
当你使用构造器注入Bean时,表明要告知spring要将一个id为sgtPoppers的对象注入的cdPlayer对象中。
另一种是使用spring3.0引入的c命名空间。
使用这个命名空间要在xml头部加上c元素的命名文件 xmlns:c="http://www.springframework.org/schema/c"
<bean id="cdPlayer" class="com.qunincey.CDPlayer" c:_0-ref="sgtPoppers"/>
这种方式命名方式十分诡异,c:代表命名空间,_0代表的是构造参数名,我这里使用的是_0代表第一个构造参数,如果只有一构造参数直接使用c:_-ref也是可以的。
将字面值注入
前面介绍了将对象注入到对象中,下面介绍将值注入到spring容器,例如将来配置数据库账号密码的很多都是硬编码的形式。和前面一样有两种方式。
<bean id="cdPlayer" class="com.qunincey.CDPlayer" >
<constructor-arg value="Sq"/>
</bean>
另外一种
<bean id="cdPlayer" class="com.qunincey.CDPlayer" c:_0="Sq"/>
将集合注入
spring还可以支持将集合注入到对象中,例如
<bean id="blankDisc" class="com.qunincey.collections.BlankDisc">
<constructor-arg>
<list>
<ref bean="sgtPoppers"/>
<ref bean="cdPlayer"/>
</list>
</constructor-arg>
</bean>
其实还可以使用<set>元素,只不过set元素内的重复值会被自动过滤,存放顺序也不会得到保证
2.属性注入设置
spring除了可以配置构造参数外,还可以设置属性,同样的属性也提供了两种方式,第一种方法使用<property>
<bean id="cdPlayer" class="com.qunincey.CDPlayer">
<property name="cd" ref="sgtPoppers"/>
</bean>
还有一种是p元素,引入xmlns:p="http://www.springframework.org/schema/p"
<bean id="cdPlayer" class="com.qunincey.CDPlayer" p:cd-ref ="sgtPoppers">
将字面值注入到属性
<property>元素 <property name="cd" value="qwe"/>
p元素 <bean id="cdPlayer" class="com.qunincey.CDPlayer" p:cd="qwe">
将集合注入到属性
<property>元素:
<property name="tracks">
<list>
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
</list>
</property>
p元素不能装配集合,但是可以用util命名空间来简化配置,导入命名空间xmlns:util="http://www.springframework.org/schema/util"
<util:list id="trackList">
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
</util:list>
<bean id="compactDisc"
class="soundsystem.properties.BlankDisc"
p:title="Sgt. Pepper's Lonely Hearts Club Band"
p:artist="The Beatles"p:tracks-ref="trackList" />
使用@Import注解可以导入配置类,使用@ImportResource可以导入配置文件 在配置文件(xml)中可以使用
<bean class="xxxConfig" />来导入配置类
|
|
|
总结
|
|
|
注解名字
|
|
|
@Component
|
@Component("name")
|
可以为类设置别名
|
@ComponentScan
|
@ComponentScan("backage")
|
设置包名(如果包名和配置类不在同一个目录,则设置另外的包名)
|
|
@ComponentScan(basePackages={"backage",“backage2”)
|
设置基础包名,这个参数可以是复数形式 |
|
@ComponentScan(basePackageClasses={backage.class,backage2.class})
|
basePackageClasses可以直接指定类名
|
@Autowired
|
|
自动注入相对应的类(Autowired可以注释在方法上,变量上spring都会尝试注入)
|
|
@Autowired(required=false)
|
使用required可以解决无法创建否异常
|
@Configuration
|
|
配置类
|
@Bean
|
|
配置类中在配置Bean使用的注解
|
|
@Bean(initMethod="init")
|
可以调用Bean的生命周期例如 destroyMethod
|
|
@Bean(name="init")
|
指定名字
|
@Import
|
@Import(xxx.class)
|
导入配置类
|
|
@ImportResource("xxx.xml")
|
导入配置文件
|