1. 程式人生 > >【spring框架11】spring的幾個Annotation實現(上)

【spring框架11】spring的幾個Annotation實現(上)

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u013517797/article/details/43889483

spring除了XML的配置,還可以用Annotation註解來實現spring的配置功能,下面來介紹裡面一些配置方法

1.Annotation第一步

a)修改xml檔案,參考文件<context:annotation-config/> 基於註解(Annotation-based)的配置 在 Spring 2.5中已經可以用註解的方式去驅動 Spring 的依賴注射了。更重要的是,@Autowired註解提供了與第 3.3.5 節 “自動裝配(autowire)協作者”一節中描述的同樣功能,並且提供了更細緻的控制與更好的適應性。Spring 2.5 也支援 JSR-250 中的一些註解,例如@Resource,@PostConstruct,以及@PreDestroy。

<?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/>
     
</beans>

(載入了<context:annotation-config/>就相當於隱式註冊 post-processors, 包括了 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,也包括了前面提到的RequiredAnnotationBeanPostProcessor四個bean,用來完成註解的載入) 加了:xmlns:context="http://www.springframework.org/schema/context" 與<context:annotation-config/> xsd定義了它所控制的xml都能寫什麼,就是我們當前檔案的名稱空間(裝著我能寫的名字) 2.Autowired a)預設按型別by type  

<?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="cn.edu.hpu.dao.Impl.UserDaoImpl">
     <property name="daoId" value="1"></property>
  </bean>
	
  <bean id="userService" class="cn.edu.hpu.service.UserService"> 	 
  </bean>
  
</beans>

注意,此時userService的bean裡面並沒有加id=u的bean。我們用註解來進行AutoWired 在UserService的getUserDao方法上面加註解@Autowired(預設byType)

package cn.edu.hpu.service;
 
import org.springframework.beans.factory.annotation.Autowired;
 
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.dao.Impl.UserDaoImpl;
import cn.edu.hpu.model.User;
 
 
public class UserService {
 
 
	private UserDao userDao;
	
	public void init(){
		System.out.println("init");
	}
	
	public UserDao getUserDao() {
		return userDao;
	}
	@Autowired
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
 
 
	public void add(User u){
		this.userDao.save(u);
	}
	
	public void destroy(){
		System.out.println("destroy");
	}
	
}

測試:

package cn.edu.hpu.service;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;
 
 
public class UserServiceTest {
	
	@Test
	public void testAdd() throws Exception{
		ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
		
		UserService userService=(UserService)ctx.getBean("userService");
		System.out.println(userService.getUserDao());
		ctx.destroy();
	}
}

UserDaoImpl.java:改寫了toString方法,返回daoId

package cn.edu.hpu.dao.Impl;
 
import java.util.List;
import java.util.Map;
import java.util.Set;
 
 
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;
 
 
public class UserDaoImpl implements UserDao{
 
	private int daoId;
	
	public int getDaoId() {
		return daoId;
	}
 
	public void setDaoId(int daoId) {
		this.daoId = daoId;
	}
 
	public void save(User u) {
	    System.out.println("add success!!");		
	}
 
	@Override
	public String toString() {
		
		return "daoid="+daoId;
	}
 
}

測試結果: daoid=1 也就是用Annotation也可以實現Autowired b)如果想用byName,使用@Qulifier 如果有好幾個Type一樣的,就應該用byName了:

<?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="cn.edu.hpu.dao.Impl.UserDaoImpl">
     <property name="daoId" value="1"></property>
  </bean>
  <bean id="u2" class="cn.edu.hpu.dao.Impl.UserDaoImpl">
     <property name="daoId" value="2"></property>
  </bean>
	
  <bean id="userService" class="cn.edu.hpu.service.UserService">
  </bean>
  
</beans>

在UserService的getUserDao方法的引數前加@Qualifier("XX"),其中 "XX"是相應bean的id UserService.java:

package cn.edu.hpu.service;
 
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
 
 
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.dao.Impl.UserDaoImpl;
import cn.edu.hpu.model.User;
 
 
public class UserService {
 
 
	private UserDao userDao;
	
	public void init(){
		System.out.println("init");
	}
	
	public UserDao getUserDao() {
		return userDao;
	}
	@Autowired
	public void setUserDao(@Qualifier("u2")UserDao userDao) {
		this.userDao = userDao;
	}
 
 
	public void add(User u){
		this.userDao.save(u);
	}
	
	public void destroy(){
		System.out.println("destroy");
	}
	
}

測試:

package cn.edu.hpu.service;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;
 
 
public class UserServiceTest {
	
	@Test
	public void testAdd() throws Exception{
		ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
		
		UserService userService=(UserService)ctx.getBean("userService");
		System.out.println(userService.getUserDao());
		ctx.destroy();
	}
}

結果: daoid=2 說明註解@Qualifier("u2")起到了作用 c)寫在private filed(第三種輸入形式)(不建議,破壞封裝) @Autowired(required=false)就是可以去自動獲取,如果沒有也可以不要(可有可無) d)如果寫在set上,@qualifier需要寫在引數上 補充: 前面在XML中提到的ini-method和的destroy-method用註解實現就是在相應方法上加: @PostConstruct與@PreDestroy  

@Scope("XXX")裡面指定是用什麼樣的生命範圍(singleton、prototype)