b) singleton 单例(无论去多少次都是同一个 bean)
c) proptotype 每次创建新的对象
6. 集合注入
a) Spring_0700_IOC_Collections
b) 很少用,不重要!参考程序
7. 自动装配
a) Spring_0800_IOC_AutoWire
b) byName
c) byType
d) 如果所有的 bean 都用同一种,可以使用 beans 的属性:default-autowire
-
(这里会报错,因为有两个userDAO 和UserDAO2 都是int 类型!)
(如果说byname 则会显示第一个的内容“1”!,因为UserService 类里面的userDAO 属性与第一个的名字一
样!)
8. 生命周期
lazy-init (不重要)
init-method 与 destroy-methd 不要和 prototype 一起用(了解)
a) Spring_0900_IOC_Life_Cycle
b)
c)
class="com.bjsxt.service.UserService"
id="userService"
scope="prototype"
9. Annotation 第一步:
a) 修改 xml 文件,参考文档
b) 默认按类型 by type
c) 如果想用 byName,使用@Qulifier
d) 写在 private field(第三种注入形式)(不建议,破坏封装)
e) 如果写在 set 上,@qualifier 需要写在参数上
f)
10. @Resource(重要)
a) 加入:j2ee/common-annotations.jar
b) 默认按名称,名称找不到,按类型
c) 可以指定特定名称
d) 推荐使用
e) 不足:如果没有源码,就无法运用 annotation,只能使用 xml
11. @Component
@Service @Controller @Repository(四个一样的功能!!)
a) 初始化的名字默认为类名首字母小写
b) 可以指定初始化 bean 的名字
首先先加载
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
即 读beans.xml 里面的内容,然后通过
找从com.bjsxt 开始“scan”含@component 的类,
找到之后就初始化对象,结果在
其一个属相的set 方法上找到一个源为“u”的一个bean,于是就加载那个bean!
12. @Scope
13. @PostConstruct = init-method;(在构造对象后执行此方法)
@PreDestroy = destroy-method;(在容器销毁前执行此方法)
什么是 AOP
1. 面向切面编程 Aspect-Oriented-Programming
a) 是对面向对象的思维方式的有力补充
2. Spring_1400_AOP_Introduction
3. 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码
a) Filter
b) Struts2 的 interceptor
4. 概念:
a)
JoinPoint 释意:切面与原方法交接点 即 切入点
b) PointCut 释意:切入点集合
是com.xyz.someapp.service.下面的任何类,任何方法,任何返回值的一个切入点的集合。
c) Aspect(切面)释意:可理解为代理类前说明(简单的理解为夹在类的新的业务逻辑,就是业务逻辑类)
d) Advice 释意:可理解为代理方法前说明 例如@Before(即加在切面上的说明)
e) Target 释意:被代理对象 被织入对象
f) Weave 释意:织入
Spring AOP 配置与应用
SpringAOP的底层实现技术---JDK动态代理
2008-06-1210:38:54
JDK动态代理
在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难
想象它有多大的实际用途,现在我们终于发现动态代理是实现AOP的绝好底层技术。
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler
是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在
一起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。这样讲一定很抽象,我们马上着手动用
Proxy和InvocationHandler这两个魔法戒对上一节中的性能监视代码进行AOP式的改造。
首先,我们从业务类ForumServiceImpl中删除性能监视的横切代码,使ForumServiceImpl只负责具体的业务逻辑,
如所示:
代码清单5ForumServiceImpl:移除性能监视横切代码
packagecom.baobaotao.proxy;
publicclassForumServiceImplimplementsForumService{
publicvoidremoveTopic(inttopicId){
①
System.out.println("模拟删除Topic记录:"+topicId);
try{
Thread.currentThread().sleep(20);
}catch(Exceptione){
thrownewRuntimeException(e);
}
②
}
publicvoidremoveForum(intforumId){
①
System.out.println("模拟删除Forum记录:"+forumId);
try{
Thread.currentThread().sleep(40);
}catch(Exceptione){
thrownewRuntimeException(e);
} ②
}
}
在代码清单5中的①和②处,原来的性能监视代码被移除了,我们只保留了真正的业务逻辑。
从业务类中移除的横切代码当然还得找到一个寄居之所,InvocationHandler就是横切代码的家园乐土,我们将性能监
视的代码安置在PerformaceHandler中,如代码清单6所示:
代码清单6PerformaceHandler
packagecom.baobaotao.proxy;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
publicclassPerformaceHandlerimplementsInvocationHandler{
privateObjecttarget;一般的都有一个object对象,object是被代理对象!
publicPerformaceHandler(Objecttarget){//①target为目标的业务类
this.target=target;