spring之初识Ioc&Aop
Spring框架的作用
spring是一个轻量级的企业级框架,提供了ioc容器、Aop实现、dao/orm支持、web集成等功能,目标是使现有的java EE技术更易用,并促进良好的编程习惯。
Spring框架主要用于与其他技术(struts,hibernate等)进行整合,可将应用程序中的Bean组件实现低耦合关联.最终可以提高系统扩展和维护性.
将来我们利用Spring框架管理系统的各个组件(Action,Service,DAO).采用Spring的IOC和AOP机制实现各组件的关联.从而实现了低耦合调用.增强了系统可维护性和扩展性.
Spring基础jar包
Spring ioc 控制反转(Inversion of Control)
控制反转也被称为依赖注入,是面向对象编程中的一种设计理念,用来减低代码之间的耦合度。
IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
例:
- public class HelloSpring {
- private String who = null;
- public void print() {
- System.out.println("hello" + this.getWho());
- }
- public String getWho() {
- return who;
- }
- public void setWho(String who) {
- this.who = who;
- }
- }
applicationContext.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!-- services -->
- <!-- 通过bean元素声明需要Spring创建的实例,该实例的类型通过class属性指定,并通过id属性为该实例指定一个唯一名称,以便在程序中使用 -->
- <bean id="helloSpring" class="cn.cnsdhzzl.biz.HelloSpring">
- <!-- 此处name属性的值对应类中属性的setWho,并为value属性赋值‘Spring’ -->
- <property name="who" value="Spring">
- </property>
- </bean>
- <!-- more bean definitions for services go here -->
- </beans>
测试类:
- @Test
- public void fristSpring() {
- // 从classpath路径中读取Spring配置文件,实例化Spring的上下文
- ApplicationContext ac = new ClassPathXmlApplicationContext(
- "applicationContext.xml");
- // 通过上下文的getBean方法,根据xml文件中的id属性值过去bean的实例
- HelloSpring hs = (HelloSpring) ac.getBean("helloSpring");
- // 实例调用方法
- hs.print();
- }
注:
- ApplicationContext:是一个接口,负责读取Spring配置文件,管理对象的加载、生成,维护Bean对象与Bean对象质检的依赖关系,负责Bean的生命周期等。
- ClassPathXmlApplicationContext:是ApplicationContext接口的实现类,用于从classPath路径中读取Spring配置文件(FileSystemXMLApplicationContext也可以用于加载Spring配置文件)。
相对于控制反转,依赖注入的说法也许更容易理解一些,即由容器(如Spring)负责吧组件所依赖的具体对象注入(赋值)给组件,从而避免组件之间以硬编码的方式组织在一起。
spring Aop(Aspect Oriented Programming)
在业务系统中,总有一些散落、渗透到系统各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也陈伟‘切面’
面向切面编程,简单的说就是在不改变源程序的基础上为代码段增加新的功能,对代码段进行增强处理。
Aop一般适用于具有横切逻辑的场合,如切入日志、访问控制、事务管理、性能检测。
Aopjar包
例:
定义一个dao和实现
- public interface UserEntityDao {
- public void save(UserEntity user);
- }
定义一个biz和实现
- public class UserEntityBizImpl implements UserEntityBiz {
- private UserEntityDao dao;
- @Override
- public void save(UserEntity user) {
- dao.save(user);
- }
- public UserEntityDao getDao() {
- return dao;
- }
- public void setDao(UserEntityDao dao) {
- this.dao = dao;
- }
- }
创建前置增强类
- //通过methodBeforeAdvice实现前置增强
- public class LoggerBefore implements MethodBeforeAdvice {
- private static final Logger logger = Logger.getLogger(LoggerBefore.class);
- @Override
- public void before(Method method, Object[] arguments, Object target)
- throws Throwable {
- logger.info("调用" + target + "的" + method.getName() + "方法。" + "方法入参"
- + Arrays.toString(arguments));
- }
- }
创建后置增强类
- //通过afterreturningadvice实现后置增强
- public class LoggerAfterReturning implements AfterReturningAdvice {
- private static final Logger logger = Logger
- .getLogger(LoggerAfterReturning.class);
- @Override
- public void afterReturning(Object returnValue, Method method,
- Object[] arguments, Object target) throws Throwable {
- logger.info("调用" + target + "的" + method.getName() + "方法" + "方法返回值:"
- + returnValue);
- }
- }
配置applicationContext.xml
- <!-- 声明要创建的实体类 -->
- <bean id="daoImpl" class="cn.cnsdhzzl.dao.impl.UserEntityDaoImpl"></bean>
- <bean id="biz" class="cn.cnsdhzzl.biz.impl.UserEntityBizImpl">
- <property name="dao" ref="daoImpl"></property>
- </bean>
- <bean id="loggerBefore" class="cn.cnsdhzzl.aop.LoggerBefore"></bean>
- <bean id="loggerAfterReturning" class="cn.cnsdhzzl.aop.LoggerAfterReturning"></bean>
- <!-- 定义切入点 -->
- <aop:config>
- <aop:pointcut id="pointcut"
- expression="execution(public void save(cn.cnsdhzzl.entity.UserEntity))" />
- <!-- 插入增强处理(织入) -->
- <aop:advisor advice-ref="loggerBefore" pointcut-ref="pointcut" />
- <aop:advisor advice-ref="loggerAfterReturning"
- pointcut-ref="pointcut" />
- </aop:config>
注:
exection是切入点指示符,他的括号中是一个切入点表达式,可以配置要切入的方法,切入点表达式支持模糊匹配
- 任意公共方法的执行:
- execution(public * *(..))
- 任何一个名字以“set”开始的方法的执行:
- execution(* set*(..))
AccountService
接口定义的任意方法的执行:- execution(* com.xyz.service.AccountService.*(..))
- 在service包中定义的任意方法的执行:
- execution(* com.xyz.service.*.*(..))
- 在service包或其子包中定义的任意方法的执行:
- execution(* com.xyz.service..*.*(..))
- 在service包中的任意连接点(在Spring AOP中只是方法执行):
- within(com.xyz.service.*)
- 在service包或其子包中的任意连接点(在Spring AOP中只是方法执行):
- within(com.xyz.service..*)
- 实现了
AccountService
接口的代理对象的任意连接点 (在Spring AOP中只是方法执行):- this(com.xyz.service.AccountService)
'this'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得代理对象在通知体内可用。 - 实现
AccountService
接口的目标对象的任意连接点 (在Spring AOP中只是方法执行):- target(com.xyz.service.AccountService)
'target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得目标对象在通知体内可用。 - 任何一个只接受一个参数,并且运行时所传入的参数是
Serializable
接口的连接点(在Spring AOP中只是方法执行)- args(java.io.Serializable)
'args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得方法参数在通知体内可用。请注意在例子中给出的切入点不同于execution(* *(java.io.Serializable))
: args版本只有在动态运行时候传入参数是Serializable时才匹配,而execution版本在方法签名中声明只有一个Serializable
类型的参数时候匹配。 - 目标对象中有一个
@Transactional
注解的任意连接点 (在Spring AOP中只是方法执行)- @target(org.springframework.transaction.annotation.Transactional)
'@target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 - 任何一个目标对象声明的类型有一个
@Transactional
注解的连接点 (在Spring AOP中只是方法执行):- @within(org.springframework.transaction.annotation.Transactional)
'@within'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 - 任何一个执行的方法有一个
@Transactional
注解的连接点 (在Spring AOP中只是方法执行)- @annotation(org.springframework.transaction.annotation.Transactional)
'@annotation'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 - 任何一个只接受一个参数,并且运行时所传入的参数类型具有
@Classified
注解的连接点(在Spring AOP中只是方法执行)- @args(com.xyz.security.Classified)
'@args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 - 任何一个在名为'
tradeService
'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):- bean(tradeService)
- 任何一个在名字匹配通配符表达式'
*Service
'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):- bean(*Service)
spring之初识Ioc&Aop的更多相关文章
- Spring 之初识IOC和DI
下载Spring jar包 Spring官网 下载地址 Sping核心jar包 IOC简介 IOC:控制反转,指以前程序自己创建对象,现在将创建对象的控制权交给了第三方(Spring)了 IoC底层实 ...
- spring的长处 ioc aop
spring 的长处? 1.减少了组件之间的耦合性 ,实现了软件各层之间的解耦 2.能够使用easy提供的众多服务.如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它非 ...
- spring ioc aop 原理
spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- 对 Spring 的核心(AOP 和 IOC)的理解(大白话)
Spring 首先它是一个开源而轻量级的框架.其核心容器的主要组件是Bean工厂(BeanFactory).Bean工厂使用控制反转(IOC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AO ...
- 详谈 Spring 中的 IOC 和 AOP
这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)
Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1) IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...
- Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP
1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...
随机推荐
- 粒子群算法 Particle Swarm Optimization, PSO(转贴收藏)
粒子群算法(1)----粒子群算法简介 http://blog.csdn.net/niuyongjie/article/details/1569671 粒子群算法(2)----标准的粒子群算法 htt ...
- jenkins远程命令执行利用工具
昨天看小飞侠写的py的jenkins的脚本,昨天晚上在微信里评论今天写一个JAVA的GUI的tools. 早上花了点时间写一下: code: package com.tools; import jav ...
- VSFTP安全加固
这几天在公司需要做基线安全,一直都没有经验,所以在网上找了一些,做来参考学习. vsftp配置详解 这里是对vsftp配置文件的详细解释,主要参考了<RedHat8.0网络服务>一书中&l ...
- ORA-01009: 必需的参数缺失
第一步:看看是否有参数没有配: 第二步:如果第一步没问题,那么请在英文半角下把sql语句重新写一遍 以上~
- hdu 4946 Just a Joke(数学+物理)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4969 Just a Joke Time Limit: 2000/1000 MS (Java/Others) ...
- 学习Berkeley DB- 入门
1 导言 首先,我们要了解Berkeley DB的一些基本特性,在IBM的开发网站上有篇文章对其有比较清晰的介绍: 这篇文章讲到了BDB的设计思想和核心数据结构.以及数据访问算法:并有常用函数使用范例 ...
- C# 线程(一)
From : http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www. ...
- 关于HTML5与移动开发
OSChina API列表: android api:http://tool.oschina.net/apidocs AppCan移动开发平台:http://doc.appcan.cn/#!/guid ...
- Threejs 使用的3D格式
3D格式你可以通过任意软件导出(.3ds,dae等),但是threejs 无法使用, 1,http://www.blender.org/ 下载这款开源的3d软件 2,https://github.co ...
- js学习笔记-编写高效、规范的js代码-Tom
编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定 ...