天天看點

Spring 基于純注解方式的使用

注解和xml混合開發遺留問題

想一想能不能将以下這些bean的配置都從xml中去掉,并且最終将xml也去掉。如果可以,那我們就可以脫離xml配置了。

  • 注解掃描配置(能不能去掉)
<!--開啟注解并掃描指定包中帶有注解的類-->
<context:component-scan base-package="com.kkb.spring.service"/>
<context:property-placeholder src=""></context:property-placeholder>
           
  • 非自定義的bean配置(比如:SqlSessionFactory和BasicDataSource配置)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlsessionFactoryBean">
	<property name="dataSource" value=“dataSource”></property>
</bean>
           
  • 去掉xml後,如何建立ApplicationContext

    之前建立ApplicatioContext否是通過讀取xml檔案進行建立的。

@Configuration

相當于spring的xml配置檔案

從spring3.0開始可以使用@Configuration定義配置類,可以替換xml配置檔案

配置類内部包含有一個或多個被@Bean注解的方法,這些方法會将會被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext類進行掃描,并用于建構bean定義對象,初始化Spring容器。

  • 屬性:

    value:用于指定配置類的位元組碼

  • 示例代碼:
@Configuration
public class SpringConfiguration{
	//spring容器初始化時,會調用配置類的無參構造函數
	public SpringConfiguration(){
		System.out.println("容器初始化。。。");
	}
}
           

@Bean

相當于标簽

作用為:注冊bean對象,主要用來配置非自定義的bean,比如DriDridDataSource、SqlSessionFactory

@Bean标注在方法上面(傳回某個執行個體的方法)

  • 屬性:

    name:給目前@Bean注解方法建立的對象指定一個名稱(即bean的id)。如果不指定,預設與标注的方法名稱相同。

    @Bean注解預設作用域為單例singleton作用域,可通過@scope(“prototype”)設定為原型作用域。

  • 示例代碼:
@Configuration
public class SpringConfiguration{
	//spring容器初始化時,會調用配置類的無參構造函數
	public SpringConfiguration(){
		System.out.println("容器初始化。。。");
	}
	
	@Bean
	@Scope("prototype")
	public SQLSessionFactory userService(){
		SQLSessionFactory sqlSessionFactory=new DefaultSqlSessionFactory();
		sqlSessionFactory.setxxx();
		return 	sqlSessionFactory;
	}
}
           

@ComponentScan

相當于context:component-scan标簽

元件掃描器,掃描@Component、@Controller、@Service、@Repository注解的類。

該注解是編寫在類上面的,一般配合@Configuration注解一起使用。

  • 屬性:

    basePackages:用于指定要掃描的包。

    value:和basePackages作用一樣。

  • 示例代碼

    Bean類(Service類):

@Service
public class	UserServiceImpl implements UserService{
	@Override
	public void saveUser(){
		System.out.println("儲存使用者 Service實作類");
	}
}
           

配置類:

@Configuration
@ComponentScan(basePackages="com.sping.service")
public class SpringConfiguration{
	public SpringConfiguration(){
		System.out.println("容器初始化。。。")
	}
}
           

@PropertySource

相當于context:property-placeholder标簽

編寫在類上面,作用是加載properties配置檔案

  • 屬性

    value[]:用于指定properties檔案路徑,如果類路徑下,需要寫上classpath

  • 示例代碼
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig{
	@Value("${jdbc.driver}")
	private String driver;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
	
	/**
	*建立一個資料源,并存入spring容器中
	*@return	
	*/
	@Bean(name="dataSource")
	public DataSource createDataSource(){
		try{
			ComboPooledDataSource ds=new ComboPooledDataSource();
			ds.setDriverClass(driver);
			ds.setJdbcUrl(url);
			ds.setUser(username);
			ds.setPassword(password);
			return ds;
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}
}
           

properties檔案:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring
jdbc.username=root
jdbc.password=root
           

@Import

相當于spring配置檔案中的标簽

用來組合多個配置類,在引入其他配置類,可以不再用@Configuration注解,當然寫上也沒問題

  • 屬性

    value:用來指定其他配置類的位元組碼檔案

  • 執行個體代碼:
@Configuration
@ComponentScan(basepackages="com.spring")
@Import({jdbcConfig.class})
public class SpringConfiguration{
}

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig{
}
           

建立純注解方式上下文容器

  • java應用(ApplicationConfigApplicationContext)
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService=context.getBean(UserService.class);
userService.saveUser();
           
  • web應用(AnnotationConfigApplicationContext)
<web-app>
	<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext	
    </param-value>
  </context-param>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      com.spring.test.SpringConfiguration	
    </param-value>
  </context-param>
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
</web-app>