【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)