Spring入门
程序员文章站
2022-07-12 13:03:14
...
Spring体系结构
- Spring的核心是控制反转(IOC)和面向切面(AOP),IOC中的DI(依赖注入)实现了解耦,接口+实现类==》接口+setter()方法;AOP进一步解耦,纵向继承变为了横向抽取。
IOC
- 正常创建对象直接new,有了spring之后,将由Spring创建对象实例,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中。这就是控制反转。
DI
- 依赖:一个对象需要使用另一个对象;注入:通过setter方法进行另一个对象实例设置。DI实现了解耦,接口=new一个实现类转换成了接口+setter()方法实现两个对象之间的解耦。
AOP
- 经典应用场景:事务管理,性能监控等。
- 实现原理:aop底层采用代理机制(反射生成代理)进行实现。接口 + 实现类的情况下spring可采用jdk动态代理Proxy。只有实现类无接口的情况下spring采用cglib字节码增强。
- 基本概念一个图说明一切:
- 动态代理的理解:其实就是对装饰设计模式的一种简化
- cglib字节码增强与jdk动态代理的区别(3个):前者不需要接口;前者需要依赖第三方类库;前者实现原理实际上是继承,生成子类,因此该类或方法最好不要声明final.
public class MyBeanFactory {//编写一个工厂去生成代理类
public static UserService createService(){
//1 目标类
final UserService userService = new UserServiceImpl();
//2切面类
final MyAspect myAspect = new MyAspect();
/* 3 代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面
* Proxy.newProxyInstance
* 参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。
* 一般情况:当前类.class.getClassLoader();
* 目标类实例.getClass().get...
* 参数2:Class[] interfaces 代理类需要实现的所有接口
* 方式1:目标类实例.getClass().getInterfaces() ;注意:只能获得自己接口,不能获得父元素接口
* 方式2:new Class[]{UserService.class}
* 例如:jdbc 驱动 --> DriverManager 获得接口 Connection
* 参数3:InvocationHandler 处理类,接口,必须进行实现类,一般采用匿名内部
* 提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke
* 参数31:Object proxy :代理对象
* 参数32:Method method : 代理对象当前执行的方法的描述对象(反射)
* 执行方法名:method.getName()
* 执行方法:method.invoke(对象,实际参数)
* 参数33:Object[] args :方法实际参数
*
*/
UserService proxService = (UserService)Proxy.newProxyInstance(
MyBeanFactory.class.getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//前执行
myAspect.before();
//执行目标类的方法
Object obj = method.invoke(userService, args);
//后执行
myAspect.after();
return obj;
}
});
return proxService;
}
}
Transactions
Spring注解
- 注解就是一个类,使用@+注解名称取代 xml配置文件。
- 注解使用前提,添加命名空间,让spring扫描含有注解类
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
- @Component 取代 bean class=””
- @Repository :dao层 取代 bean class=””
- @Service:service层 取代 bean class=””
- @Controller:web层 取代 bean class=”” 以上四个是等效的
- @Value(“”) 对普通值依赖注入
- @Autowired 对引用值依赖注入
- @Scope(“prototype”) 实现多例
- @PostConstruct 生命周期中初始化
- @PreDestroy 生命周期中销毁
下一篇: Unity安卓读写配置文件