装配bean
在
Spring
应用中,由
容器负责创建各个对象,
并创建各个对象之间的
依赖关系
。这种行为通常被称为
装配(
wiring
)
,这就是依赖注入(
DI
)的本质。
spring容器
负责创建应用程序中的
bean并通过DI来
协调这些对象之间的关系。
spring的三种装配机制:
1.xml现实装配
在Spring配置文件中通过<bean>标签配置方式
例:
//dao层接口
public interface UserDao {
public void x();
}
//dao层接口实现类
public class RealiUserDao implements UserDao{
public void x() {
System.out.println("dao层实现方法");
}
}
//servlce层接口
public interface UserDaoservlic {
public void x();
}
//service层接口实现类
public class realiUserDaoservlic implements UserDaoservlic{
//属性,(dao层接口)
private UserDao dao;
//set方法
public void setDao(UserDao dao) {
this.dao = dao;
}
public void x() {
System.out.println("servlic层实现类");
}
}
//Spring配置文件
<!-- dao层userdao实现类bean -->
<bean id="
RealiUserDao" class="JDBC.dao.RealiUserDao"></bean>
<!-- service层userdaoservlic实现类bean -->
<bean id="realiUserDaoservlic" class="JDBC.servlic.realiUserDaoservlic">
<property name="dao" ref="
RealiUserDao"></property>
</bean>
//测试类
@Test
public void test(){
ApplicationContext context = Spring.getContext();
realiUserDaoservlic bean = (realiUserDaoservlic)context.getBean("realiUserDaoservlic");
bean.x();
}
2.隐式bean,发现机制和自动装配(注解)
注解方式:
@Component ==<bean></bean>
@Autowried ==<propery>/<constructor-arg>
根据类型注入:
不需要写set方法
根据数据类型在Spring容器中找实现类
如果有多个 通过属性名匹配
如果没有匹配的类型对象,不注入任何东西
@Reaource(@Resource/@Reaource("参数名"))
@Resource/
通过属性名注入后用类型:
通过属性名 在Spring容器中查找匹配
如果按属性名没有匹配的,将会按照类型去匹配
@Reaource("参数名")
通过名称注入:
通过参数名,去Spring容器中查找对应名称的bean
如果 按照名称没有匹配到,不会按类型去匹配
例:
//dao层接口
public interface UserDao {
public void x();
}
//dao层接口实现类
@Component
public class RealiUserDao implements UserDao{
public void x() {
System.out.println("dao层实现方法");
}
}
//servlce层接口
public interface UserDaoservlic {
public void x();
}
//service层接口实现类
@Component
public class realiUserDaoservlic implements UserDaoservlic{
//属性,(dao层接口)
@Autowired //就可以省去set方法
private UserDao dao;
public void x() {
System.out.println("servlic层实现类");
}
}
//spring配置文件
<!-- 自动扫面该包下所有的@Component -->
<context:component-scan base-package="JDBC"></context:component-scan>
//测试类
@Test
public void test(){
ApplicationContext context = Spring.getContext();
//首字母要小些
realiUserDaoservlic bean =(realiUserDaoservlic)context.getBean("
realiUserDaoservlic");
bean.x();
}
绝大多数情况下,开发人员可以根据个人品味选择这三种装配方式中的一种。
Spring
也
支持在同一个项目中混合使用不同的装配方式。
1)在java代码
中使用
@Autowired或@Resource
注解方式进行装配,这两个注解的区别是:
@Autowired
默认按类型装配,
@Resource
默认按名称装配,当找不到与名称匹配的
bean才会按类型装配。
2
)
@Autowired
可用于字段上,也可用于属性的
set方法上。
public class realiUserDaoservlic implements UserDaoservlic{
//属性,(dao层接口)
//就可以省去set方法
@Autowired
private UserDao dao;
@Autowired
public void x() {
System.out.println("servlic层实现类");
}
}
3
)
@Autowired
默认是按类型装配依赖对象,如果我们想使用按名称装配,可以结合
@Qualifier
注解一起使用。如:默认按照
@Qualifier(“”)
的参数名去
spring容器中查找相应的javaBean.
@Autowired
@Qualifier("realiUserDaoservlic")
private UserDao dao;
4)@Resource注解和@Autowired一样,也可以标注在
字段或者是属性的
setter方法上,
但它默认按名称装配。名称可以通过
@Resource
的
name属性指定,如果没有指定name属性,当注解标注在字段上,默认取字段的名称作为bean名称
寻找依赖对象,当标注在属性的
setter方法上,即默认取属性名作为bean
名称寻找依赖对象。
@Autowired
private UserDao dao;
注意:如果没有指定
neme
属性,并且按照默认的名称仍然找不到依赖对象时,
@Resource注解会回退到按类型装配,但一旦指定
了
name属性,就只能按名称装配了。
总结:
|
@Autowired
|
@Resource
|
默认装配类型
|
默认按类型装配
|
默认按名称装配。
|
|
1.如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
2.如果查询的结果不止一个,那么@Autowired会根据名称来查找。
3.如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
|
找不到与名称匹配的bean才会按类型匹配
@Resource匹配失败,按类型匹配
@Resource()匹配失败,无法按类型匹配
|
位置
|
字段+set方法上
|
字段+set方法上
|
其它
|
@Autowired@Qualifier(“”)
变成按名称装配
|
@Resource()参数就是装配用的名称
如果没有写参数,默认按属性名装配
|
那么使用
@Autowired
的原理是什么?
其实在启动spring IoC
时,容器自动装载了一个
AutowiredAnnotationBeanPostProcessor
后置处理器,当容器扫描到
@Autowied
、
@Resource
或
@Inject
时,就会在
IoC
容器自动查找需要的
bean
,并装配给该对象的属性。所以用到了spring-aop
的jar
包。
<
bean
class
="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
spring2.5
为我们引入了自动扫描机制,可以在类路径底下寻找标注了
@Component, @Service, @Controller,@Repository
注解的类,并把这些类纳入
spring容器中
管理。
其中
@Service用于标注业务层组件
@Controller用于标注
控制层组件,
@Repository用于标注数据库访问组件,即Dao层组件
而
@Component泛指组件,当组件不好归类的时候我们可以用@Component,其它的用相应层的组件注解。
默认javaBean的名称为
类的首字母小写
|
指定的javaBean名称
|
@Component
|
@Component("personService")
|
@Repository
|
@Repository("dao")
|
@Service
|
@Service("service")
|
@Controller
|
@Controller("web")
|
3.java
代码装配(了解)
配置类。
例:
@Configuration
public class COPlayerConfig {
@Bean
public Compactisc sgtpeppers(){
return New SgtPeppers();
}
}
4
总结
Spring框架
的核心是
spring容器,容器负责管理应用中组件的
生命周期,创建这些组件并保证他们的依赖能够得到满足,这样,这些组件才能完成预定的任务。在工作中,不管你采用什么方式实现
Bean的装配,甚至可以实现三种方式的混合配置。
另外,由于
@Autowired是按照类型进行装配的 所以可以用集合去接收,
比如
@Autowired
Collection<BaseXxx> xxs;//BaseXxx可为接口或父类,装配的为全部的实现类或子类