一.spring注解
1.準備工作
(1)導入common-annotations.jar
(2)導入schema檔案 檔案名為spring-context-2.5.xsd
(3)在xml的beans節點中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans
……
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
…….
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
…
<!-将針對注解的處理器配置好->
<context:annotation-config/>
…..
<beans>
2.在java代碼中使用@Autowired或@Resource注解方式進行裝配,這兩個注解的差別是:
@Autowired預設按類型裝配
@Resource預設按名稱裝配,當找不到名稱比對的bean才會按類型裝配,預設注解
@Resource private PersonDao persondao;
<bean id="personDao" class="com.hf.dao.impl.PersonDaoBean"></bean>
首先是判斷persondao是否與xml裡的personDao名字相同,相同則注入,不同則判斷persondao是否是com.hf.dao.impl.PersonDaoBean類型,是則注入不是則傳回null.
@Resource(name="personDao")
private PersonDao dao;
<bean id="personDao" class="com.hf.dao.impl.PersonDaoBean"></bean>
判斷name名稱是否與bean中id相同不同則傳回null
Spring自帶注解方式
@Autowired
@Qualifier("personDao")
private PersonDao persondao;
預設是按類型注入,加上@Qualifier("personDao")則按名稱注入
3.通過在classpath自動掃描方式把元件納入spring容器中管理
spring2.5為我們引入了元件自動掃描機制,它可以在類路徑底下尋找标注了@Component,@Service,@Controller,@Repository注解的類,并将這些類納入進spring容器中管理.它們的作用和xml檔案中使用bean節點配飾元件是一樣的.
(1)使用到了注解的功能(需要注解準備工作的内容)
(2)在xml中加入
<context:component-scan base-package="com.hf"/>
其中base-package為需要掃描的包(包含子包)
(3)@Service用于标注業務層元件
@Controller用于标注控制層元件(如struts中的action)
@Repository用于标注資料通路元件,即DAO元件
@Component泛指元件,當元件不好歸類的時候,我們可以使用這個注解進行标注.
(4)業務類
@Service
public class PersonServiceBean implements PersonService {…..}
輸出類
AbstractApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService= (PersonService)cxt.getBean("personServiceBean");
System.out.println(personService);
cxt.close();
使用注解中bean的id預設名稱為類名稱的首字母小寫名稱
————————————————
自己指定名稱
@Service("aa")//預設作用域範圍是單例範圍
public class PersonServiceBean implements PersonService {…..}
輸出類
AbstractApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService= (PersonService)cxt.getBean("aa");
System.out.println(personService);
cxt.close();
———————————————
@Service("aa") @Scope("prototype")//修改bean的作用域
public class PersonServiceBean implements PersonService {….}
———————————————————
@PostConstruct
public void init(){
System.out.println("初始化");
}
@PreDestroy
public void destory(){
System.out.println("釋放資源");
}
4.AOP注解方式
(1)準備工作:
.導入common-annotations.jar,aspectjrt.jar,aspectweaver.jar,cglib-nodep-2.13.jar.
.導入schema檔案 檔案名為spring-aop-2.0.xsd.
.在xml的beans節點中配置.
<?xml version="1.0" encoding="UTF-8"?>
<beans
……
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
……
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
…
<!-配置解釋處理器為@AspectJ注解提供支援->
<aop:aspectj-autoproxy/>
…
<beans>
(2)
<bean id="myInterceptor" class="com.hf.service.impl.MyInterceptor"></bean>
<bean id="personService" class="com.hf.service.impl.PersonServiceBean"></bean>
将切面和被攔截的類交給spring管理
(3)切面類
@Aspect //定義切面類
public class MyInterceptor {
@Pointcut("execution (* com.hf.service.impl.PersonServiceBean.*(..))")//定義切入點
private void andMethod()//聲明一個切入點{}
@Before("andMethod() && args(name)") //帶參數 隻攔截符合參數類型的方法
public void doAccessCheck(String name){
System.out.println("前置通知"+name);
}
@AfterReturning(pointcut="andMethod()",returning="result")//帶傳回值的無傳回值的方法result為null
public void doFaterReturning(String result){//攔截方法執行後擷取傳回值對象
System.out.println("後置通知:"+result);
}
@After("andMethod()")
public void doAfter(){
System.out.println("最終通知");
}
@AfterThrowing(pointcut="andMethod()" , throwing="e") //擷取例外并列印
public void doAfterThrowing(Exception e){
System.out.println("例外通知:"+e);
}
@Around("andMethod()")//環繞通知
public Object doBasecProfiling(ProceedingJoinPoint pjp )throws Throwable{
//if(){//判斷是否與權限
System.out.println("進入通知");
Object result = pjp.proceed();
System.out.println("離開 通知");
//}
return result;
}
}
(4)業務類 PersonServiceBean
public class PersonServiceBean implements PersonService{
public void save(String name){
throw new RuntimeException("純屬例外");
// System.out.println("我是Save方法"+name);
}
public String update() {
return "我是update方法";
}
}
原文位址:http://hi.baidu.com/jeyorxiao/blog/item/d58eb9db40340bd7b7fd4833.html