组件扫描相关知识

组件扫描:
  指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器。等价与原有XML配置中的<bean>定义功能。

组件扫描可以替代大量XML配置的<bean>定义
1.指定扫描类路径
  使用组件扫描,首先需要在XML配置中指定扫描类路径
  <context:component-scan base-package="org.example">
  上面配置,容器实例化时会自动扫描org.example包及其子包下所有组件类


2.自动扫描的注解标记
  指定扫描类路径后,并不是该路径下所有组件类都扫描到Spring容器,只有在组件类定义前面有以下注解标记时,才会扫描奥Spring容器
注解标记描述
@Component 通用注解
@Name 通用注解
@Repository 持久化层组件注解
@Sercive 业务层组件注解
@Controller 控制层组件注解


3.自动扫描组件的命名
  当一个组件在扫描过程中被检测到时,会生成一个默认id值,默认id值为小写字母开头的类名。也可以在注解标记中自定义id,下面两个组件id名字分别是oracleUserDao和loginService

eg:

  @Repository
  public class OracleUserDao implement UserDao{
    //...
  }
  @Service("loginService")
  public class UserService{
    //...
  }
4.指定组件的作用域
  通常收Spring管理的组件,默认的作用域是“singleton”。如果需要其他的作用域可以使用@Scope注解,只要在注解中提供作用域的名称即可
  eg: @Scope("prototype")
    @Repository
    public class OracleUserDao implements EmpDao{
      //...
    }
5.初始化和销毁回调函数的控制
 @PostConstruct和PreDestroy注解分别用于指定初始化和销毁回调方法。
 eg: public class ExampleBean{
   @PostConstruct
   public void init(){
     //初始化回调方法
   }
  }
  
 @PreDestroy
   public void destroy(){
    //销毁回调方法
  }
6.指定依赖注入关系
  具有依赖关系的Bean对象,利用下面任意一种注解都可以实现
  1> @Resource
    用在字段定义或Setter方法定义前面,默认首先按名称匹配注入,然后按内型匹配
    eg: public class UserService{
      //@Resource
       private UserDao userDao;
       @Resource
      public void setUserDao(UserDao dao){
        this.userDao = dao;
        }
       }
  当遇到多个匹配Bean是注入会发生错误,可显式指定名称,
  例如 (@Resource(name=""empDao1))

  2> @Autowired/@Qualifier
    用在字段定义或setter方法定义前面,默认按类型匹配注入
    public class UserService{
      //@Autowired
      private UserDao userDao;
      @Autowired
      public void setUserDao(UserDao dao){
      this.userDao = dao;
      }
    }
  当@Autowired遇到多个匹配Bean是注入会发生错误,可指定名称,
   public class UserService{
    //@Autowired
    //@Qualifier("mysqlUserDao")
      private UserDao userDao;

    @Autowired
      public void setUserDao(@Qualifier("mysqlUserDao")
      UserDao dao){
        this.userDao = dao;
        }
      }

 
3> @Inject/@Named
  @Inject注解标记是Spring3.0开始添增的对JSR-330标准的支持,使用前需要导包(JSR-330.jar),使用方法与@Autowired相似
  当@Inject遇到多个匹配Bean是注入会发生错误,可使用@Named指定名称限定,使用方法与@Autowired的@Qualifier类似。

6.注入Spring表达式值

  @Value注解可以注入Spring表达式值,使用方法如下:
  1>首先在XML配置中指定要注入的 properties文件
      <util:properties id="jdbcProps"
            location="classpath:db.properties"/>
  2>然后在setter方法前使用@Value注解
      public class JDBCDataSource{
        @Value("#{jdbcProps.url}")
        private String url;
        @Value("#{jdbcProps.driver}")
        public void setUrl(String driver){
          … …
          }
        }


posted @ 2015-08-27 22:26  XuZT  阅读(489)  评论(0编辑  收藏  举报