美文网首页
Spring Bean装配之基于Java的容器注解

Spring Bean装配之基于Java的容器注解

作者: pinnuli | 来源:发表于2018-07-31 11:02 被阅读0次

    @Bean

    用于配置和初始化一个有SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/>,通常和@Configuration配合使用

    @Configuration
    public class StoreConfig {
    
        @Bean(name = "store",initMethod = "init",destroyMethod="destroy")
        public BeanStore beanStore(){
            return new BeanStore();
        }
    }
    

    相当于以下XML配置

    <beans>
    
        <bean id="store" class="com.pinnuli.spring.ioc.beanannotation.BeanStore" init-method="init" destroy-method="destroy"></bean>
    </beans>
    

    如果@Bean没有指定名称,则默认为方法名,这里即是beanStore。</br>
    如果需要指定范围,即XML配置时的属性scope,那么可以用@Scope注解,且可以配置@Scope注解的proxyMode属性来配置代理方式,即XML配置时的scope-proxy属性

    @Scope(value="prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
    

    @ImportResource,@Value

    通过@ImportResource加载资源文件,@Value获取属性值,比如有文件config.properties内容如下:

    jdbc.username=root
    password=root
    url=127.0.0.1
    

    则可以通过将此内容配置到XML文件,如config.xml

    <?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" >
    
        <context:property-placeholder location="classpath:/config.properties"/>
    
    </beans>
    

    然后在定义bean时,通过@ImportResource加载文件,通过@Value获取属性的值

    @Configuration
    @ImportResource("classpath:config.xml")
    public class StoreConfig {
    
        @Value("${url}")
        private String url;
    
        @Value("${jdbc.username}")
        private String username;
    
        @Value("${password}")
        private String password;
    
        @Bean
        public MyDriverManager myDriverManager() {
            return new MyDriverManager(url, username, password);
        }
    }
    

    注意:这里的用户名字段如果直接为username,那么得到的将是当前系统的用户名,而不是文件中的属性值,所以一般此类属性名称加前缀,如jdbc.username,jdbc.password


    基于泛型的自动装配

    比如现有如下接口:

    public interface Store<T> {
    }
    

    IntegerStoreStringStore是他的两个实现类:

    public class IntegerStore implements Store<Integer> {
    }
    
    public class StringStore implements Store<String> {
    }
    

    那么在定义bean时可以按照如下方法:

    @Autowired
    private Store<String> s1;
    
    @Autowired
    private Store<Integer> s2;
    
    @Bean
    public StringStore stringStore() {
        return new StringStore();
    }
    
    @Bean
    public IntegerStore integerStore() {
        return new IntegerStore();
    }
    

    那么s1将会自动装配到StringStores2将会是IntegerStore


    JSR支持

    JSR250的支持

    1.@Resource
    注解变量或方法,且有一个name属性值,默认Spring解释改值为被注入bean的名称,若没有指定name,那么名称从方法名或者属性名得出

    @Service
    public class JsrServie {
        
        @Resource
        private JsrDAO jsrDAO;
        
        @Resource
        public void setJsrDAO(@Named("jsrDAO") JsrDAO jsrDAO) {
            this.jsrDAO = jsrDAO;
        }
    }
    

    2.@PostConstruct和@PreDestroy
    @PostConstruct,初始化,相当于init-Method属性
    @PreDestroy,销毁,相当于destroy-Method属性

    @PostConstruct
    public void init() {
    }
    
    @PreDestroy
    public void destroy() {
    }
    

    JSR330的支持

    需要依赖javax.injet

    1.@Inject
    @Autowired等效,可以使用于类,属性,方法,构造器
    2.@Named
    使用特定名称进行依赖注入,与@Component等效

    @Named
    public class JsrServie {
        
        @Inject
        private JsrDAO jsrDAO;
        
        @Inject
        public void setJsrDAO(@Named("jsrDAO") JsrDAO jsrDAO) {
            this.jsrDAO = jsrDAO;
        }
    }
    

    参阅:
    慕课网:Spring入门篇

    相关文章

      网友评论

          本文标题:Spring Bean装配之基于Java的容器注解

          本文链接:https://www.haomeiwen.com/subject/ipvcvftx.html