SpringIOC和AOP简单概述
Spring学习:主要学习两大块IOC AOP
一、IOC
- IOC:控制反转(也可以叫做依赖注入)的基本认识:
当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可。由此可见,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受。
依赖注入:从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此称之为依赖注入。
- 依赖注入两个方法:
1)设值注入(setter)property:成员变量的setter方法来注入被依赖对象,在Spring的依赖注入里大量使用。
例如:
要注入的对象 :
package com.yc.pojo; import java.io.Serializable; public class Student implements Serializable{ private static final long serialVersionUID = 1L; private Integer sid; private String name; public Student() { // System.out.println("学生对象创建了"); } public Student(Integer sid, String name) { // System.out.println("学生对象创建了"); this.sid = sid; this.name = name; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [sid=" + sid + ", name=" + name + "]"; } }
set方法注入
<bean id="stu1" class="com.yc.pojo.Student" scope="prototype">
<property name="sid" value="1001"></property>
<property name="name" value="张三"></property></bean>
2)构造注入constructor-arg:驱动Spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化——这就是构造注入的本质。
例如:
直接来个角色bean
public class Roles { private int id; private String roleName; public Roles() { } public Roles(int id,String roleName) { this.id=id; this.roleName = roleName; } @Override public String toString() { return "Users [id=" + id + ", name=" + roleName + "]"; } }
spring配置
<bean id="roles" class="cn.com.ztz.spring.model.Roles">
<constructor-arg value="1"/>
<constructor-arg value="管理员"/>
</bean>
在运行我们的测试方法
public class SpringTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); Roles u = (Roles)context.getBean("roles"); System.out.println(u.toString()); } }
注:建议采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。
- Spring中的bean
1)概念:
对于开发者来说,使用Spring框架主要是做两件事:①开发Bean;②配置Bean。
对于Spring框来说,是根据配置文件创建Bean实例,并调用Bean实例的方法完成"依赖注入"。
2)容器中Bean的作用域:
- singleton: 单例模式,只生成一个实例。
- Prototype:通过容器的getBean()方法获取prototype作用域的Bean
- request: 对于一次HTTP请求,只有在Web应用中使用Spring时,该作用域才真正有效。
- session:该作用域将 bean 的定义限制为 HTTP 会话。只在web-aware Spring ApplicationContext的上下文中有效。
- global session: 每个全局的HTTP Session对应一个Bean实例。同样只在Web应用中有效。
3)自动装配注入合作者Bean
由Spring容器检查XML配置文件内容,为调用者Bean注入被依赖的Bean。
Spring自动装配可通过
<beans/>元素的default-autowire属性指定,该属性对配置文件中所有的Bean起作用;
也可通过对<bean/>元素的autowire属性指定,该属性只对该Bean起作用。
当一个Bean既使用自动装配依赖,又使用ref显式指定依赖时,则显式指定的依赖覆盖自动装配依赖;对于大型的应用,不鼓励使用自动装配。
- Spring的"零配置"支持
搜索Bean类
Spring提供如下几个Annotation来标注Spring Bean:
@Component: 标注一个普通的Spring Bean类
@Controller: 标注一个控制器组件类
@Service: 标注一个业务逻辑组件类
@Repository: 标注一个DAO组件类
5.使用@Resource配置依赖
@Resource使用@Resource与<property.../>元素的ref属性有相同的效果。@Resource不仅可以修饰setter方法,也可以直接修饰实例变量
使用@PostConstruct和@PreDestroy定制生命周期行为
@PostConstruct和@PreDestroy用于定制Spring容器中Bean的生命周期行为。它们都用于修饰方法,无须任何属性。前者修饰的方法时Bean的初始化方法;后者修饰的方法时Bean销毁之前的方法。
Spring4.0增强的自动装配
@Autowired注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。
二、Spring的AOP
1.AOP基本概念:
AOP(Aspect Orient Programming)专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。
2.使用AspectJ实现AOP
AspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想。其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题;另一个部分是工具部分,包括编译、调试工具等。
3.AOP实现可分为两类:
静态AOP实现: AOP框架在编译阶段对程序进行修改,即实现对目标类的增强,生成静态的AOP代理类,以AspectJ为代表。
动态AOP实现: AOP框架在运行阶段动态生成AOP代理,以实现对目标对象的增强,以Spring AOP为代表。
一般来说,静态AOP实现具有较好的性能,但需要使用特殊的编译器。动态AOP实现是纯Java实现,因此无须特殊的编译器,但是通常性能略差。
3.关于面向切面编程的一些术语:
切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。
连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around"、"before"和"after"等类型
切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
Spring的AOP支持
Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。
为了在应用中使用@AspectJ支持,Spring需要添加三个库:
aspectjweaver.jar
aspectjrt.jar
aopalliance.jar
并在Spring配置文件中做如下配置:
<!--启动@AspectJ支持-->
<aop:aspectj-autoproxy/>
<!--指定自动搜索Bean组件、自动搜索切面类-->
<context:component-scan base-package="edu.shu.sprint.service">
<context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>
来源:http://codepub.cn/2015/06/21/Basic-knowledge-summary-of-Spring/