顾问包装通知:
通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强
顾问(advisor)是Spring提供的另外一种切面,可以织入到指定的方法中 接口 PointcutAdvisor
实现类:NameMatchMethodPointcutAdvisor(基于方法名称的增强顾问),RegexpMethodPointcutAdvice(基于正则表达式的增强顾问)
首先创建测试用例:
IService类:
package com.wdy; public interface IService { public void doSome(); public void Say(); }
IService实现类:
package com.wdy; public class IServiceImpl implements IService { public void doSome() { System.out.println("---呵呵业务---"); } public void Say() { System.out.println("++++dadad++++"); } }
增强类:
package com.wdy; import org.springframework.aop.AfterReturningAdvice; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class MyAdvisor implements AfterReturningAdvice, MethodBeforeAdvice { public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("++++之后++++"); } public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("++++之前++++"); } }
application_after.xml 配置文件
顾问代理生成器
顾问代理生成器,当我们声明好顾问后为目标对象生成代理对象。如果项目中 存在多个代理对象的话,需要实例化许多的ProxyFactoryBean,我们可以使用顾问代理生成器来解决这个问题。
顾问代理生成器主要分两种:
- 自动顾问代理生成器:DefaultAdvisorAutoProxyCreator
- 名称顾问代理生成器:BeanNameAutoProxyCreator
<bean id="iServiceImpl" class="com.wdy.IServiceImpl"></bean> <bean id="myAdvisor" class="com.wdy.MyAdvisor"></bean> <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="myAdvisor"></property> <property name="patterns"> <list> <value>.*do.*</value> </list> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames" value="iServiceImpl"></property> <property name="interceptorNames" value="advisor"></property> </bean>
注:
. 代表单个字符
* 代表前一项出现0-n次
+ 代表前一项出现1-n次
匹配时方法名最好两个或以上字符
测试类:
import com.wdy.IService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyAdvisorTest {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("application_after.xml");
IService serv=(IService) ctx.getBean("iServiceImpl");
System.out.println("*********************");
serv.doSome();
serv.Say();
System.out.println("***********----------");
}
}
执行结果:
名称顾问代理生成器也可以替换成自动顾问代理生成器,自动顾问代理生成器默认为Spring中所有的Bean对象创建代理 无需使用ID注入
注解方式实现IOC和AOP
3.1 IOC和DI的注解
IOC:
@Component:实现Bean组件的定义
@Repository:用于标注DAO类,功能与@Component作用相当
@Service:用于标注业务类
@Controller:用于标注控制器
DI:
@Resource(name="userService")
默认ByName方式,如果name确实默认按照ByType方式注入
@Autowired
默认ByType方式,如果出现同名类,则不能按照Type进行注入
需要使用@Qualifier 指明ID
首先配置application_after.xml文件(我这里叫这个名字):
<!-- 注解支持 --> <context:annotation-config></context:annotation-config> <!-- 扫描:当前包中的类和子包中的类 --> <context:component-scan base-package="com.wdy"/>
因为首先需要项目支持注解
Dao层:
package com.wdy.mapper; import com.wdy.entity.IUser; public interface IUserMapper { public int Xunxi(IUser user); }
package com.wdy.mapper; import com.wdy.entity.IUser; import org.springframework.stereotype.Repository; @Repository public class IUserMapperImpl implements IUserMapper { public int Xunxi(IUser user) { System.out.println("呵呵123456"); return 1; } }
service层:
package com.wdy.service; import com.wdy.entity.IUser; public interface IUserService { public int Xunxi(IUser user); }
package com.wdy.service; import com.wdy.entity.IUser; import com.wdy.mapper.IUserMapper; import javax.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service("iUserServiceImpl") public class IUserServiceImpl implements IUserService { @Autowired private IUserMapper iUserMapper; public int Xunxi(IUser user) { return iUserMapper.Xunxi(user); } }
测试类:
import com.wdy.entity.IUser; import com.wdy.service.IUserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class IocTest { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("application_after.xml"); IUserService ius=(IUserService) ctx.getBean("iUserServiceImpl"); ius.Xunxi(new IUser()); } }
执行结果就不写了