zoukankan      html  css  js  c++  java
  • 学习 Spring (十) 注解之 @Bean, @ImportResource, @Value

    Spring入门篇 学习笔记

    @Bean

    @Bean 标识一个用于配置和初始化一个由 Spring IoC 容器管理的新对象的方法,类似于 XML 配置文件的

    可以在 Spring 的 @Configuration 注解的类中使用 @Bean 注解任何方法,在方法里面创建对象返回

    @Configuration
    public class AppConfig{
        @Bean
    	public MyService myService(){
    	    return new MyServiceImpl();
    	}
    }
    

    示例

    新建类:

    public interface Store<T> {
    
    }
    
    
    public class StringStore implements Store<String> {
    	
    	public void init() {
    		System.out.println("This is init.");
    	}
    	
    	public void destroy() {
    		System.out.println("This is destroy.");
    	}
    	
    }
    
    @Configuration
    public class StoreConfig {
    
    	@Bean(initMethod = "init", destroyMethod = "destroy")// 如果没有指定 name,那么name 为方法的名称
    	public StringStore stringStore() {
    		return new StringStore();
    	}
    
    }
    

    添加测试:

    @RunWith(BlockJUnit4ClassRunner.class)
    public class TestJavabased extends UnitTestBase {
    	
    	public TestJavabased() {
    		super("classpath*:spring-beanannotation.xml");
    	}
    	
    	@Test
    	public void test() {
    		Store store = super.getBean("stringStore");
    		System.out.println(store.getClass().getName());
    	}
    	
    }
    

    @Bean 默认是单例的,如果要改变作用域范围,可以再添加 @Scope 注解

    @ImportResource

    <beans>
            
        <context:annotation-config/>
        <!--加载资源文件-->
        <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/>
    
        <bean class="com.acme.AppConfig"/>
    
        <!--引用资源文件中的配置内容-->
        <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="url" value="${jdbc.username}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
            
     </beans>
    

    使用 @ImportResource 可以代替上面 XML 配置:

    @Configuration
    @ImportResource("classpath:/com/acme/properties-config.xml")
    public class AppConfig{
        @Value("${jdbc.url")
    	private String url;
    	
    	@Value("${jdbc.username}")
    	private String username;
    	
    	@Value("${jdbc.password}")
    	private String password;
    	
    	@Bean
    	public DataSource dataSource(){
    	    return new DriverManagerDataSource(url, username, password);
    	}
    }
    

    示例:

    添加类:

    public class MyDriverManager {
    	
    	public MyDriverManager(String url, String userName, String password) {
    		System.out.println("url : " + url);
    		System.out.println("userName: " + userName);
    		System.out.println("password: " + password);
    	}
    
    }
    

    添加配置文件 config.properties:

    jdbc.username=root
    jdbc.password=root
    jdbc.url=127.0.0.1
    

    添加配置文件 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>
    

    修改类 StoreConfig:

    @Configuration
    @ImportResource("classpath:config.xml")
    public class StoreConfig {
    
    	@Value("${jdbc.url}")
    	private String url;
    
    	@Value("${jdbc.username}")
    	private String username;
    
    	@Value("${jdbc.password}")
    	private String password;
    
    	@Bean
    	public MyDriverManager myDriverManager(){
    		return new MyDriverManager(url, username, password);
    	}
    
    
    //	@Bean(initMethod = "init", destroyMethod = "destroy")// 如果没有指定 name,那么name 为 方法的名称
    //	public StringStore stringStore() {
    //		return new StringStore();
    //	}
    
    }
    

    添加测试:

    @Test
    public void testMyDriverManager() {
    	MyDriverManager manager = super.getBean("myDriverManager");
    	System.out.println(manager.getClass().getName());
    }
    

    基于泛型的自动装配

    示例

    新建类:

    public class IntegerStore implements Store<Integer> {
    
    }
    

    修改类:

    @Configuration
    @ImportResource("classpath:config.xml")
    public class StoreConfig {
    
    	@Autowired
    	@Qualifier(value="stringStore")
    	private Store<String> s1;
    
    	@Autowired
    	@Qualifier(value="integerStore")
    	private Store<Integer> s2;
    
    
    	@Bean
    	public StringStore stringStore() {
    		return new StringStore();
    	}
    	@Bean
    	public IntegerStore integerStore() {
    		return new IntegerStore();
    	}
    
    	@Bean
    	public StringStore stringStoreTest(){
    		System.out.println("s1: " + s1.getClass().getName());
    		System.out.println("s2: " + s2.getClass().getName());
    		return new StringStore();
    	}
    }
    

    添加测试:

    @Test
    public void testG() {
    	Store store = super.getBean("stringStoreTest");
    }
    

    源码:learning-spring

  • 相关阅读:
    关于C语言中的绝对值函数
    B. Interesting drink(水题 二分)
    A. Boring Apartments(水题)
    A. FashionabLee(水题)
    A. Collecting Coins(水题)
    A. Fancy Fence(水题)
    最小公因数,最小公倍数,以及快速幂模板
    android:layout_gravity 和 android:gravity 的区别
    Android开发之Intent略解
    java中类的创建及初始化过程
  • 原文地址:https://www.cnblogs.com/victorbu/p/10464857.html
Copyright © 2011-2022 走看看