Spring Aop
Aop:
面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。
1:主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
2:主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,
我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
AOP的一些实现:
用AOP给service加一些其他的功能
Dao层:
package cn.spring.mapper;
import cn.spring.entity.User;
public interface IUserMapper {
public Integer addUser(User userinfo);
}
Dao层实现类
package cn.spring.mapper.impl;
import cn.spring.entity.User;
import cn.spring.mapper.IUserMapper;
public class IUserMapperImpl implements IUserMapper {
@Override
public Integer addUser(User userinfo) {
System.out.println("addUser");
return 0;
}
}
Service层
package cn.spring.service;
import cn.spring.entity.User;
public interface IUserService {
public Integer addUser(User userinfo);
}
Service层实现类:
package cn.spring.service.Impl;
import cn.spring.entity.User;
import cn.spring.mapper.IUserMapper;
import cn.spring.service.IUserService;
public class IUserServiceImpl implements IUserService {
private IUserMapper iUserMapper;
public IUserMapper getiUserMapper() {
return iUserMapper;
}
public void setiUserMapper(IUserMapper iUserMapper) {
this.iUserMapper = iUserMapper;
}
@Override
public Integer addUser(User userinfo) {
Integer integer = iUserMapper.addUser(userinfo);
return integer;
}
}
第一种方法:实现MethodBeforeAdvice(前置增强)接口,AfterReturningAdvice(后置增强)接口
增强类:
package cn.spring.advice;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class AdivceMethod implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("====================日志=================");
}
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println("====================事务=================");
}
}
applicationcontextbean.xml
将Dao层与service层进行关联
<bean id="iUserMapper" class="cn.spring.mapper.impl.IUserMapperImpl"></bean> <bean id="iUserService" class="cn.spring.service.Impl.IUserServiceImpl"> <property name="iUserMapper" ref="iUserMapper"></property> </bean>
找到要增强类 <bean id="Adivec" class="cn.spring.advice.AdivceMethod"></bean>
配置aop
<aop:config >
<aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/> 找到在那增强,并指定增强哪里的内容
<aop:advisor advice-ref="Adivec" pointcut-ref="pointcut"></aop:advisor> 调用增强
</aop:config>
测试类:
package cn.spring.test;
import cn.spring.entity.User;
import cn.spring.print.print;
import cn.spring.service.IUserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class aoptest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontextbean.xml");
IUserService bean = (IUserService)context.getBean("iUserService");
bean.addUser(new User());
}
}
结果:

第二种方法:不实现MethodBeforeAdvice(前置增强)接口,AfterReturningAdvice(后置增强)接口
增强类:
package cn.spring.advice;
public class Adivce{
public void before(){
System.out.println("基于配置的前置");
}
public void after(){
System.out.println("基于配置的后置");
}
}
applicationcontextbean.xml
将Dao层与service层进行关联
<bean id="iUserMapper" class="cn.spring.mapper.impl.IUserMapperImpl"></bean> <bean id="iUserService" class="cn.spring.service.Impl.IUserServiceImpl"> <property name="iUserMapper" ref="iUserMapper"></property> </bean>
<bean id="befor" class="cn.spring.advice.Adivce"></bean> <aop:config > <aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/> <aop:aspect ref="befor"> <aop:before method="before" pointcut-ref="pointcut"></aop:before> <aop:after method="after" pointcut-ref="pointcut"></aop:after> </aop:aspect> </aop:config>
结果:

Spring Ioc的三种注入方式:
实体类:
package cn.spring.entity;
public class User {
private Integer id;
private String username;
public Integer getId() {return id; }
public void setId(Integer id) { this.id = id;}
public String getUsername() {return username;}
public void setUsername(String username) { this.username = username;}
public User(Integer id, String username) {
this.id = id;
this.username = username;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
基于Setter注入:
applicationcontextbean.xml
<bean id="user" class="cn.spring.entity.User">
<property name="id" value="1"></property>
<property name="username" value="李一"></property>
</bean>-->
基于构造注入:
<bean id="user" class="cn.spring.entity.User">
<constructor-arg value="2" type="java.lang.Integer" index="0"></constructor-arg>
<constructor-arg value="王二" type="java.lang.String" index="1"></constructor-arg>
</bean>
该方法必须有对应的构造方法
p命名空间注入
<bean id="user" class="cn.spring.entity.User" p:id="3" p:username="刘三"></bean>
基于setter注入,代表参数必须有set方法
浙公网安备 33010602011771号