Spring续集

装配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.  @Autowired 改为 @Resource 结果一样
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 代码装配(了解)
用类代替 xml配置文件, 实现Bean的装配.需要在类上著名@Comfiguration 注解,表明该类是一个
配置类。
例:
@Configuration
public class COPlayerConfig {
@Bean
public Compactisc sgtpeppers(){
return New SgtPeppers();
}
}

总结
Spring框架 的核心是 spring容器,容器负责管理应用中组件的 生命周期,创建这些组件并保证他们的依赖能够得到满足,这样,这些组件才能完成预定的任务。在工作中,不管你采用什么方式实现 Bean的装配,甚至可以实现三种方式的混合配置。
另外,由于 @Autowired是按照类型进行装配的 所以可以用集合去接收,
比如
@Autowired
Collection<BaseXxx> xxs;//BaseXxx可为接口或父类,装配的为全部的实现类或子类  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值