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方法



posted on 2019-10-26 16:19  wishsaber  阅读(244)  评论(0)    收藏  举报