通过在classpath自动扫描方式把组件纳入spring容器中管理

通过在classpath自动扫描方式把组件纳入spring容器中管理

通常情况下我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如
果这些这组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。
spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了@Component、@Service、
@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使
用bean节点配置组件是一样的。要使用自动扫描机制,我们需要打开以下配置信息:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd"
 >	
</beans>

给类使用的注解的名字及其作用:

注解名字作用
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action、Servlet层)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

例子:

@Repository
public class UserDao {
	public void addUser()
	{
		//方法体
	}
}

给依赖属性使用的注解

  • @Autowired
  • @Resource

@Autowired

  • @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。
  • @Autowired采取的策略为按照类型注入。
    例如:
public class UserService {
    @Autowired
    private UserDao userDao; 
}

如上代码所示,这样装配回去spring容器中找到类型为UserDao的类,然后将其注入进来。这样会产生一个问题,当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着@Qualifier使用。

@Qualifier告诉spring具体去装配哪个对象

这个时候我们就可以通过类型和名称定位到我们想注入的对象。

public class UserService {
    @Autowired
    @Qualifier(name="userDao1")    
    private UserDao userDao; 
}

@Resource

  • @Resource注解由J2EE提供,需要导入包javax.annotation.Resource。
  • @Resource默认按照属性的名字自动注入,也可以指定name和type。

例如:

public class UserService {
    @Resource //默认情况。去Spring上下文中查找id="userDao"bean 
    private UserDao userDao; 
    @Resource(name="studentDao")  //指定name的情况  
    private StudentDao studentDao; 
    @Resource(type="TeacherDao")  //指定type的情况
    private TeacherDao teacherDao; 
    @Resource(name="manDao",type="ManDao")  //指定name和type的情况
    private ManDao manDao; 
}
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  3. 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

总结

Spring属于第三方的,J2EE是Java自己的东西。使用@Resource可以减少代码和Spring之间的耦合。

两者都可以写在字段和setter方法上。两者如果都写在属性的字段上,那么就不需要再写setter方法。

当存在多个类型,却又没有指定的时候,会报如下的错误。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_mo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值