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的方式实现了代理。