170 likes | 542 Views
Spring 依赖注入及 AOP 简介. Spring 是什么. 一个开源框架 一 个轻量级的 DI 和 AOP 容器框架 如 果将一个 j2ee 构建的应用简单分为表示层、业务逻辑、数据持久层、数据层,我们所熟悉的 ssh 框架中的 struts 用在表示层, hibernate 用在数据持久层,而 spring 则是贯穿整个. 依赖注入和 AOP. 依赖注入( DI ) : Spring 提供了一种松耦合的技术。使用 DI ,对象是被动接受依赖类而不是自己主动去找(不同于“ 委派 ”),对象不是从容器中查找它的依赖类,而是容器在实例化的时候主动加载对象并将其依赖类注入给它
E N D
Spring是什么 • 一个开源框架 • 一个轻量级的DI和AOP容器框架 • 如果将一个j2ee构建的应用简单分为表示层、业务逻辑、数据持久层、数据层,我们所熟悉的ssh框架中的struts用在表示层,hibernate用在数据持久层,而spring则是贯穿整个
依赖注入和AOP • 依赖注入(DI):Spring提供了一种松耦合的技术。使用DI,对象是被动接受依赖类而不是自己主动去找(不同于“委派”),对象不是从容器中查找它的依赖类,而是容器在实例化的时候主动加载对象并将其依赖类注入给它 • 面向切面(AOP):通过将业务逻辑从应用服务(如监控和事务管理)中分离出来,实现了内聚开发。应用对象只关心业务逻辑,而不负责系统问题(如日志和事务支持)
依赖注入 • 在Spring的核心配置文件applicationContext.xml中通过DI来装配bean • applicationContext:bean工厂,继承了BeanFactory接口,单例类 • Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的“图纸”。Java EE程序员必须学会并灵活应用这份“图纸”准确地表达自己的“生产意图”。Spring配置文件是一个或多个标准的XML文档
依赖注入 • bean元素的作用是,当我们的spring框架加载时候,spring就会自动的创建一个bean对象,并放入内存: UserServiceuserSerivce=new UserService(); userSerivce.setName(“邹方杰"); <bean id="userService" class="com.service.UserService"> <!-- 这里就体现出注入的概念. --> <property name="name"> <value>邹方杰</value> </property> </bean> 属性id表示javabean的名字,与类变量名对应 Property元素设置属性值,容器实例化时候加载类并赋值
依赖注入 <bean id=“department” class=“*.Department"> <property name="empList"> <list> <ref bean="emp1" /> <ref bean="emp2"/> </list> </property> </bean> <beans> <bean id="foo" class="...Foo"/> <bean id="bar" class="...Bar"/> </beans> 对应所依赖类的属性id
依赖注入 • DI也被称为控制反转(IoC),即我们获得以来对象的方式反转了 • 使用DI,对象的依赖都是在对象创建时由负责协调应用中各个对象的外部实体提供的。DI的关键优点是松耦合 • 得到spring 的applicationContext对象(容器对象) ApplicationContextac=new ClassPathXmlApplicationContext("applicationContext.xml"); UserServiceus=(UserService) ac.getBean("userService"); us.sayHello(); 调用getBean方法获取bean实例
依赖注入 • 依赖反转的实现:Java的反射机制 • spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean的关系 • 所谓依赖注入(控制反转)就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器(applicationContext.xml),而程序本身不再维护 • DI配合接口编程,的确可以减少层(web层) 和 业务层的耦合度 • bean的生命周期(略)
AOP简介 • AOP( aspect oriented programming ) 面向切面(方面)编程,是对所有对象或者是一类对象编程,核心是( 在不增加代码的基础上, 还增加新功能) • 程序语言发展:面向过程(c语言)——面向对象(java)——面向切面,编程粒度越来越大,但程序员知道的底层细节被隐藏了
AOP简介 • 通知bean
创建切面 • AOP介绍 • 定义AOP术语 1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。 2.连接点:应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的 字段。 3.通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实 现日志功能的代码,如向日志文件写日志。通知在连接点插入到应用系统中。 4.切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。 5.引入:为类添加新方法和属性。 6.目标对象:被通知的对象。既可以是你编写的类也可以是第三方类。 7.代理:将通知应用到目标对象后创建的对象,应用系统的其他部分不用为了支持代理对象而 改变。 8.织入:将切面应用到目标对象从而创建一个新代理对象的过程。织入发生在目标 对象生命周期的多个点上: 编译期:切面在目标对象编译时织入.这需要一个特殊的编译器. 类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器. 运行期:切面在应用系统运行时织入. 通知 通知 连接点 切 入 切 入 程序执行
创建切面 • 前置通知 public interface MethodBeforeAdvice{ void before(Method m,Object[] os ,Object target){ } } • 该接口提供了获得目标方法、参数和目标对象的机会。不能够改变运行时参数,即不能替换参数对象和目标对象。 • 注意在方法结束后不返回任何值东西。原因是该接口返回后,目标方法将会被调用,应该返回目标对象的返回值。 • ProxyFactoryBean是一个在BeanFactory中显式创建代理对象的中心类,可以给它一个要实现的接口、一个要代理的目标对象、一个要织入的通知,并且他将创建一个崭新的代理对象。
创建切面 • 定义切入点: 如果不能表达在应用系统的什么地方应用通知的话,通知将毫无用处,这就是切入点的用处。切入点决定了一个特定的类的特定方法是否满足一定的规则。若符合,通知就应用到该方法上。 <bean id="xxxService" class="…ProxyFactoryBean"> <property name="proxyInterfaces"> <value>……xxxService</value> </property> <property name="interceptorNames"> <list><value>xxxAdvisor</value></list> </property> <property name="target"><ref bean="xxxTarget" /></property> </bean>
创建切面 • Spring的目标不是提供最完善的AOP实现(虽然Spring AOP非常强大);而是要提供AOP实现与Spring IoC的紧密集成,以便帮助解决企业应用中的常见问题。 • spring只支持方法连接点:不提供属性接入点,spring的观点是属性拦截破坏了封装。面向对象的概念是对象自己处理工作,其他对象只能通过方法调用得到私有属性。