Spring学习笔记:简单的依赖注入
1:常用注解:
@Autowired:通过类型注入(byType),通过Qualifier缩小范围。可以用在set等其他方法上装配在参数列表中
@Qualifier:通过名称注入,结合Autowired使用。适用于一个类型有多个bean时通过bean的id确定唯一注入的bean。
@Inject:不适于Spring包,功能同Autowired大致相同
@Resource:默认使用byName注入,通过name或者type的值确定使用什么注入策略。不属于spring包。
@Named:用于方法级别同Component一样
具有装配功能的注解:注解在方法上时,Spring会尽量满足方法参数上声明的依赖。为避免异常,可以设置required属性为false(特别注意NPE)
@Component、Controller(控制器bean)、Repository(dao层)、Service:Component用于产生bean,后面均为Component的细化体现。
注意:spring生成bean的默认id为首字母变小写的类名。
默认不开启包扫描,需要在xml中声明<context:component-scan/>
<context:component-scan/>比<context:annotaion-config>高级:
annotaion-config:激活已经在容器中注册的bean,可以实现注入,但是无法扫描并生成新的bean
component-scan:除了具有annotation-config的功能以外,还可以扫描组件并纳入容器内管理
注意:注解不能对静态属性或对象使用:静态内容无法由spring容器直接管理。
需要对静态数据进行注入时,可以通过在内部添加set方法,并在set方法上声明自动注入
2:通过java配置类显式声明bean:
@Configuation声明该类为java配置类,@Bean注解表明该方法返回的是一个被spring管理的bean.
在默认情况下通过@Bean创建的bean名字同方法的方法名一致,也可以通过@Bean的name属性声明其他名字。
同SpringMVC类似,可以将其他的bean(无论通过何种方式得到)注入到方法的参数列表中去(byType)。
这使得java配置文件可以分开编写。
此时创建ApplicationContext则需要声明为AnnotatioConfigApplicationContext,参数为配置类的class数组。
混合配置的合并:(配置文件分模块拆分后可以直接合并到最终的配置文件中(即根配置),方便管理)
(1)在javaconfig类中可以通过@Import标签导入其他的config类,
也可以通过@ImportResource导入配置bean的xml。此时spring容器声明为AnnotatioConfigApplicationContext时只需要添加一个javaconfig类即可(可以考虑所有的配置整合在一个最终的config类中)
(2)在xml中导入:通过import标签导入其他xml。通过bean标签直接生成bean 用于导入其他的javaconfig类
3:通过xml配置spring的bean:注入bean到属性务必使用ref
p标签和c标签均为bean的属性:是否表明趋势是更倾向于使用属性而不是子标签?
向构造器注入bean或字面量:第一种方式更为灵活,推荐
(1)bean的子标签<constructor-arg ref="XX"/>用于注入bean,value="XX"用于注入字面量
(2)使用spring3.0引入的c命名空间,但是需要在xml头部声明(仅当拓展,个人直接引入文件头之后依旧无法使用,也没有提示,原因未知,有知道的希望告诉我一下)。
xmlns:c="http://www.springframework.org/schema/c"
使用格式为:bean的属性 c:_1-ref="XX"
其中-ref表明注入的是一个bean,如果注入的是字面量去掉-ref即可。_是由于在xml不允许数字作为标签第一个字符所以添加的。_后的数字表示构造函数的参数索引(即index),该数字可以更换为具体的属性值。
例如:对于构造函数constructor(arg0,arg1,arg2),注入arg2时索引为2.此时写为 c:_2-ref="XX"就可以将bean注入构造方法
向构造器内注入空值及集合:构造器的所有值都需要同时传入,可以传入null。
<null>标签表示空值null。
通过<list>标签可以传入list,list的子标签<value>或者<ref>可以给list的每一项赋值(值或bean)。
对于<set>也一样。
向bean的属性注入bean或字面量
除了<property>标签(通过调用setter注入属性及值)以外:
xmlns:p="http://www.springframework.org/schema/p"
p命名空间:用于非构造器的属性注入。也是bean的属性,用法同c标签一致: p:bean属性名-ref="XX"或者p:字面值属性名 ="XX"
不能使用list或set子标签,可以通过spring的util命名空间。
xmlns:util="http://www.springframework.org/schema/util"
Location中加入:
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
通过util的元素在bean外部声明集合,该集合可以作为一个bean并注入到属性中
property标签内设置bean为属性时ref的区别:
使用ref属性(<property ref="XX">)表示从本配置文件寻找。
而使用ref子标签表示从全局寻找。