Spring中的DI和AOP

来源:互联网 发布:uu淘宝店没评价 编辑:程序博客网 时间:2024/04/27 23:53

来源:http://blog.sina.com.cn/s/blog_51721d970100ak21.html

Spring同Struts和Hibernate一样,也是一个轻量级框架。他使现在有的技术更加易用,来推进编码最佳

实践。他的主要内容有:依赖注入容器,AOP(声明式事务),DAO/ORM,WEB集成等技术。
一:DI-->依赖注入
旨在解决复杂的软件系统。他引入了组件化的思想来解偶合。强制将组件的构件和使用分开,而明确定

义各个组件之间的接口。并在运行时注入。
那么如何在程序中使用DI呢?下面以坐车回家为例子来说明DI。

    第一:要回家有很多办法,有坐公交车和出租车等等。但是下班之前并不知道自己会选择那种方式。在程序中只能定义回家这样的接口。这个接口中定义了回家gohome()的方法,而他们(公交车和出租车)都实现这个接口;
[接口和实现类有了。定义接口在spring中是必须的,因为程序运行前并不知道最终的实现类是哪个。罗

嗦一句,如果知道了直接new就可以了也就不需要注入了]

    第二:添加spring支持。配置srping的配置文件applicationContext.xml。这个配置文件设置了很多受spring容器管理的bean。创建一个bean,(有几个实现类就创建几个bean)如:
<bean id="bus" class="com.xxx.xxx.xxximpl"></bean>
上面的意思是创建一个class所指向的对应类的实例,id为这个bean的代号。也可以使用name。只是name

可以使用特殊字符而id不可以。id后面要使用到。要完成这个例子还需要在创建一个taxi出租车的bean。
再创建一个bean:
<bean id="run" class="com.xxx.xxx.xxx">
   <property name="接口对象名" ref="上面实现类的id或name"></property>  
</bean>
这个bean意思为:class指向了一个类,并创建这个类的一个实例。这个类也就是这个例子中要运行的类,他定义了回家接口对象。而property节点就是为这个接口对象注入相应的子类实例使用的。节点中name值对应该类中接口对象名,ref为把某个受管理的bean(一定要实现这个接口)注入给这个接口对象。
   第三:下班了,该回家了。
   在第二步的下面的bean内所指向的class类中声明一个回家的对象不要new,而是从配置文件中得到:
   1:加载配置文件

   ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
   2:得到对象实例(参看第二的bean)  run run=(run) context.getBean("run");

   这样通过第二步就完成了注入。
   3:使用接口对象调用回家方法gohome();

   在调用的这个类中应对接口对象使用getter和setter方法来方便spring注入。(必须的) 

二:AOP-->面向方面(切面)编程(完成声明式事务)
    罗嗦一下代理模式:

    代理模式是一种设计模式。他一共有三个组件:1,主题接口2,被代理角色3,代理角色。

    主题接口包括了被代理角色的接口对象和代理角色接口对象。并且在代理角色中还有一个引用的被代理

的角色的对象引用。

AOP是指面向切面编程,那么什么是切面呢?举个例子:比如去超市买东西,进门的时候算是一个面买完

东西付款的时候又是一个面。等等。切面也是自己抽象出来的。
那在代码中如何使用AOP呢

1:编写业务逻辑接口和实现类(被代理类的接口和实现类)
2:编写方面代码,(前置的通知或切面应实现 MethodBeforeAdvice接口)由spring提供
spring中的切面分为前置 后置 环绕 和异常等四类
3:组装(注入)
在spring配置文件中:
创建第一个bean 指向被代理类(里面包含逻辑代码)
<bean id="buytarget" class="com.xxx.xxx.xximpl"></bean>
创建第二个bean 通知切面类(在被代理类执行前执行(前置的)),他实现了MethodBeforeAdvice接口。
<bean id="befor" class="com.xxx.xxx.BeforeAdvice"></bean>
创建第三个bean 代理类:最终通过代理类访问业务逻辑
他的class是指向又spring提供的一个类:org.springframework.aop.framework.ProxyFactoryBean
他需要三个参数
1:target  目标,指的被代理的类,上面的第一个bean
2:interceptorNames 他是一个列表他包含了所有需要在beanTarget上执行的方面。注意,advisor列表

的次序是非常重要的。
3:proxyInterfaces 代理接口,也就是spring的代理类要实现的接口,通常和被代理的接口一样。

 

原创粉丝点击