Spring的注解学习(ioc,aop结合)

首先引入jar包

aspectjrt.jar

aspectjweaver.jar

1、dao

package com.dao;

public interface OkpDao {
	public void save();
	public void update();
}

2、impl

package com.dao.impl;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.dao.OkpDao;
@Component("okpDaoImpl")
public class OkpDaoImpl implements OkpDao{
	
	public void save() {
		System.out.println("OkpDaoImpl.save()");
	}
	public void update() {
		System.out.println("OkpDaoImpl.update()");		
	}
}

3、service

package com.service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.dao.OkpDao;
@Component
public class OkpService {
	private OkpDao okpDao;

	public OkpDao getOkpDao() {
		return okpDao;
	}
	@Resource(name="okpDaoImpl")
	public void setOkpDao(OkpDao okpDao) {
		this.okpDao = okpDao;
	}
	public void save(){
		this.okpDao.save();
	}
	public void update(){
		this.okpDao.update();
	}
	@PostConstruct
	public void init(){
		
		System.out.println("容器创建前执行");
	}
	
	@PreDestroy
	public void destory(){
		System.out.println("容器销毁后执行");
	}
}

 4、切面类

package com.service;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SaveInter {
	
	@Pointcut("execution(* com.service.OkpService.*(..))")
	public void method(){};
	
	@Before("method()")
	public void before(){
		System.out.println("前置通知");
	}
	@AfterReturning("method()")  
	public void doAfter(){  
		System.out.println("后置通知");  
	}  
	@After("method()")
	public void after(){
		System.out.println("最终通知");
	}
}

@Aspect切面类

@Component 将该类加载到spring容器

@Poincut 定义一个切面

@Before 当执行切面中的方法前,会执行

@AfterReturning 方法执行完执行

@After 相当于方法中的try{}catch{}finally{}中的finally,执行完方法前会执行 

 5、测试类

package com.service;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class OkpServiceTest {

	@Test
	public void testSave() {
		BeanFactory bf=new ClassPathXmlApplicationContext("applicationContext.xml");
		OkpService okp=(OkpService) bf.getBean("okpService");
		okp.save();
		okp.update();
	}

}

  6、配置文件

<?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:tx="http://www.springframework.org/schema/tx" 
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:jee="http://www.springframework.org/schema/jee"
        xsi:schemaLocation="
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            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
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
        <context:annotation-config />
        <context:component-scan base-package="com"></context:component-scan>
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

   使用Aop注解,xml配置文件中要加入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

运行结果:

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
容器创建前执行
前置通知
OkpDaoImpl.save()
最终通知
后置通知
前置通知
OkpDaoImpl.update()
最终通知
后置通知

Don’t hurry say have no choice, perhaps, next intersection will meet hope.
原文地址:https://www.cnblogs.com/volare/p/3677274.html