zoukankan      html  css  js  c++  java
  • annotation中的Autowired

    <?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-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    
       <context:annotation-config/>
      <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
      <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
       <bean id="userService" class="com.bjsxt.service.UserService">    
      </bean>
    </beans>
    package com.bjsxt.service;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    
    import com.bjsxt.dao.UserDAO;
    import com.bjsxt.model.User;
    public class UserService {
        private UserDAO userDAO;      
        public void add(User user) {
            userDAO.save(user);
        }
            
        public UserDAO getUserDAO() {
            return userDAO;
        }    
        //为什么Autowired必须放在set里面,其他地方无效
        @Autowired
        public void setUserDAO(@Qualifier("u")UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        public void init(){
            System.out.println("init");
        }
        
        public void destroy(){
            System.out.println("destroy");
        }    
    }
        @Test
        public void test() {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            
            UserService service = (UserService)ctx.getBean("userService");
            
            service.add(new User());
            
            ctx.destroy();

    疑问:为什么autowired必须放在set方法里面在测试之中?

    Annotation-based configuration

    (The implicitly registered post-processors include AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor, as well as the aforementioned RequiredAnnotationBeanPostProcessor.)

    Note that <context:annotation-config/> only looks for annotations on beans in the same application context it is defined in. This means that, if you put <context:annotation-config/> in a WebApplicationContext for a DispatcherServlet, it only checks for @Autowired beans in your controllers, and not your services. See Section 13.2, “The DispatcherServlet for more information.

    @Autowired

    As expected, the @Autowired annotation may be applied to "traditional" setter methods:

    public class SimpleMovieLister {
    
        private MovieFinder movieFinder;
    
        @Autowired
        public void setMovieFinder(MovieFinder movieFinder) {
            this.movieFinder = movieFinder;
        }
    
        // ...
    }

    The annotation may also be applied to methods with arbitrary names and/or multiple arguments:

    public class MovieRecommender {
    
        private MovieCatalog movieCatalog;
        
        private CustomerPreferenceDao customerPreferenceDao;
    
        @Autowired
        public void prepare(MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) {
            this.movieCatalog = movieCatalog;
            this.customerPreferenceDao = customerPreferenceDao;
        }
    
        // ...
    }

    The @Autowired annotation may even be applied on constructors and fields:

    public class MovieRecommender {
    
        @Autowired
        private MovieCatalog movieCatalog;
        
        private CustomerPreferenceDao customerPreferenceDao;
    
        @Autowired
        public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
            this.customerPreferenceDao = customerPreferenceDao;
        }
    
        // ...
    }

    It is also possible to provide all beans of a particular type from the ApplicationContext by adding the annotation to a field or method that expects an array of that type:

    public class MovieRecommender {
    
        @Autowired
        private MovieCatalog[] movieCatalogs;
    
        // ...
    }

    The same applies for typed collections:

    public class MovieRecommender {
    
        private Set<MovieCatalog> movieCatalogs;
        
        @Autowired
        public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
            this.movieCatalogs = movieCatalogs;
        }
    
        // ...
    }
  • 相关阅读:
    从无到有制作Deb包的一个实例
    Redis内存存储结构分析
    岳麓实践论
    金砖四国(巴西、俄罗斯、印度和中国)
    用LLVM开发新语言
    QQ云输入法
    http://baike.baidu.com/view/1926473.htm
    21世纪商业评论
    update ubuntu to 11.10
    gnu make 中文手册教程pdf
  • 原文地址:https://www.cnblogs.com/batman425/p/7482373.html
Copyright © 2011-2022 走看看