spring(二)

spring核心是两点,一个是 IOC 容器, 一个是 AOP 切面式服务。

IOC 容器,即控制反转,本来是由应用程序管理对象之间的依赖关系,现在交给了容器管理,即交给了 IOC 容器。 Spring 的 IOC 主要使用 DI(注入)的方式实现的,不需要主动查找,对象的查找,定位和创建全部由容器管理。Spring的IOC 容器是一个轻量级的容器,没有侵入性,不需要依赖容器的API,也不需要实现一些特殊接口。

AOP指的是切面式服务,提供了一种横切性的关注点的处理方式,是一种独立的服务,遍布在系统的各个角落。

AOP的底层实现是 JDK 的动态代理,要了解动态代理,戳 代理--静态代理--动态代理

接下来,我们利用 AOP 修改动态代理的实现,分为两种情况,用Annotation(注解)的方式和采用配置文件的方式。

1.采用注解方式去修改动态代理


// 接口  UserManager.java
 
public interface UserManager {
 
    public boolean addUser(String username, String password);
 
    public void delUser(int userId);
 
    public String findUserById(int userId);
  
    public void modifyUser(int userId, String username, String password);
 }
// 接口的实现类 UserManagerImpl.java
 
public class UserManagerImpl implements UserManager {
 
  @Override
    public boolean addUser(String username, String password) {
 
       System.out.println("------UserManagerImpl.addUser-----");
       return true;
    }
 
  @Override
    public void delUser(int userId) {
 
       System.out.println("------UserManagerImpl.delUser-----");
    }
 
  @Override
    public String findUserById(int userId) {
 
       System.out.println("------UserManagerImpl.findUserById-----");
       return "zhangsan";
    }
 
  @Override
    public void modifyUser(int userId,String username, String password) {
 
       System.out.println("------UserManagerImpl.modifyUser-----");
    
    }
 
}
//通过注解方式 提取出来一个处理类

@Aspect
public class SecurityHandler {


    //* add*(..)匹配有返回值和无返回值,方法名,参数
    //addMethod()不是一个真正的方法,只是一个标识
    //addMethod()方法没有参数和返回值
    
    @Pointcut("execution(* add*(..))")
    private void addMethod(){};

    //After和 Before是可选项
    @After("addMethod()")
    private void checkSecurity() {

       System.out.println("--------checkSecurity-------");

   }
}
//配置配置文件 applicationContext.xml


//启用Aspect对Annocation的支持
<aop:aspectj-autoproxy/>
<bean id="userManager" class="*.*.*.UserManagerImpl"/>
<bean id="securityHandler" class="*.*.*.SecurityHandler"/>
//测试类

public class Client {
  BeanFactory factory = new ClassPathXmlApplicationContext(applicationContext.xml);
  UserManager userManager = (UserManager )factory.getBean("userManager");
  userManager.addUser("zhangsan","123");
}

注意,在做测试的过程中需要添加两个 jar包,org.aspectjrt和 org.aspectj.aspectjweaver

2.不采用注解,直接采用 配置文件的方式去做

//通过配置文件的方式,提取出来的代理类

public class SecurityHandler {

    private void checkSecurity() {

       System.out.println("--------checkSecurity-------");

   }
}
//将所有的都配置到配置文件中 applicationContext.xml

<bean id="userManager" class="*.*.*.UserManagerImpl"/>
<bean id="securityHandler" class="*.*.*.SecurityHandler"/>

<aop:config>
    <aop:aspect id="securityAspect" ref="securityHandler">
         <aop:pointcut id="addMethod"  expression="execution(* add*(..))"/>
         <aop:before method="checkSecurity" pointcut-ref="addMethod"/>
    </aop:aspect>


</aop:config>

其他不变。至此,我们用AOP的方式实现了代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章