1.简化Java开发
Spring的核心功能是简化Java的开发。为了降低Java开发的复杂性,Spring采取了以下四种关键性的策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
2.激发POJO的潜能
Spring竭力避免因自身的API而弄乱你的应用代码,即彻底抛弃了继承和接口。Spring的非侵入编程模型意味着这个类在Spring应用和非Spring应用中都可以发挥同样的作用。
3.依赖注入(DI)
如果一个对象只通过接口(而不是具体的实现类)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。依赖注入主要有三种方式:构造器注入、setter方法注入、接口注入。接口注入的具体实现如下所示:
interface AnimalInterface{
void initDog(Dog dog); //这里必须是被注入对象依赖的对象
}
class Animal implements AnimalInterface{
private Dog dog;
public Person(){}
@Override
public void initDog(Dog dog){
this.dog = dog;//实现注入方法接口外部通过此方法注入dog对象
}
}
创建应用组件之间协作的行为通常称为装配。Spring有二种Bean的装配方式:基于XML方式、基于Java配置方式(注解方式)。Spring通过应用上下文(Application Context)装载Bean的定义并把它们组装起来。
4.应用切面AOP
DI能够让相互协作的软件组件保持松耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件,并以声明的方式将模块化的服务应用到需要影响的业务组件中去。面向切面编程往往被定义为促使软件系统实现关注点(日志、事物管理、安全、权限认真)分离的一项技术,如果将这些实现分散到多个组件中去,将造成代码的双重复杂性:实现系统关注点功能的代码会重复出现在多个组件中;组件会因为那些与自身核心业务无关的代码而变得混乱。引入Spring AOP实现的依赖包:aopalliance.jar和aspectjweaver.jar来实现一个简单的AOP例子:核心业务接口HelloWorld,
public interface HelloWorld
{
void printHello();
void printSpring();
}
核心业务接口实现类HelloWorldImpl:
public class HelloWorldImpl implements HelloWorld
{
public void printHello()
{
System.out.println("Hello, I am Tom.");
}
public void printSpring()
{
System.out.println("Hello, I am Spring.");
}
}
模块化服务打印时间:
public class TimeHandler
{
public void printTime()
{
System.out.println("CurrentTime = " + System.currentTimeMillis());
}
}
以上三个类就可以实现SpringAOP,其的配置文件如下aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<bean id="helloWorldImpl" class="com.luna.aop.HelloWorldImpl" />
<bean id="timeHandler" class="com.luna.aop.TimeHandler" />
<aop:config>
<aop:aspect id="time" ref="timeHandler">
<aop:pointcut id="addAllMethod" expression="execution(* com.luna.aop.HelloWorld.*(..))" />
<aop:before method="printTime" pointcut-ref="addAllMethod" />
<aop:after method="printTime" pointcut-ref="addAllMethod" />
</aop:aspect>
</aop:config>
</beans>
针对以上AOP测试Main函数的实现如下所示:
public static void main(String[] args)
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("aop.xml");
HelloWorld hw = (HelloWorld)ctx.getBean("helloWorldImpl");
hw.printHelloWorld();
System.out.println("++++++++++++++++");
hw.doPrint();
}
总结:AOP实现的核心原理是动态代理,即针对目标对象生成加强或者减弱的代理对象,以此来实现AOP相关的业务功能。AOP默认会使用JDK动态代理,如果目标对象没有实现接口则使用CGLIB动态代理,更多关于动态代理的内容常见传送门:
代理模式极简实现。
原文地址: https://blog.csdn.net/u011635492/article/details/80658779