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硬盘了)。

例:

  1. public class HelloSpring {
  2. private String who = null;
  3.  
  4. public void print() {
  5. System.out.println("hello" + this.getWho());
  6. }
  7.  
  8. public String getWho() {
  9. return who;
  10. }
  11.  
  12. public void setWho(String who) {
  13. this.who = who;
  14. }
  15.  
  16. }

applicationContext.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.  
  7. <!-- services -->
  8. <!-- 通过bean元素声明需要Spring创建的实例,该实例的类型通过class属性指定,并通过id属性为该实例指定一个唯一名称,以便在程序中使用 -->
  9. <bean id="helloSpring" class="cn.cnsdhzzl.biz.HelloSpring">
  10. <!-- 此处name属性的值对应类中属性的setWho,并为value属性赋值‘Spring’ -->
  11. <property name="who" value="Spring">
  12. </property>
  13. </bean>
  14.  
  15. <!-- more bean definitions for services go here -->
  16.  
  17. </beans>

测试类:

  1. @Test
  2. public void fristSpring() {
  3. // 从classpath路径中读取Spring配置文件,实例化Spring的上下文
  4. ApplicationContext ac = new ClassPathXmlApplicationContext(
  5. "applicationContext.xml");
  6. // 通过上下文的getBean方法,根据xml文件中的id属性值过去bean的实例
  7. HelloSpring hs = (HelloSpring) ac.getBean("helloSpring");
  8.  
  9. // 实例调用方法
  10. hs.print();
  11.  
  12. }

注:

  1. ApplicationContext:是一个接口,负责读取Spring配置文件,管理对象的加载、生成,维护Bean对象与Bean对象质检的依赖关系,负责Bean的生命周期等。
  1. ClassPathXmlApplicationContext:是ApplicationContext接口的实现类,用于从classPath路径中读取Spring配置文件(FileSystemXMLApplicationContext也可以用于加载Spring配置文件)。
    相对于控制反转,依赖注入的说法也许更容易理解一些,即由容器(如Spring)负责吧组件所依赖的具体对象注入(赋值)给组件,从而避免组件之间以硬编码的方式组织在一起。

spring Aop(Aspect Oriented Programming)

在业务系统中,总有一些散落、渗透到系统各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也陈伟‘切面’

面向切面编程,简单的说就是在不改变源程序的基础上为代码段增加新的功能,对代码段进行增强处理。

Aop一般适用于具有横切逻辑的场合,如切入日志、访问控制、事务管理、性能检测。

Aopjar包

例:

定义一个dao和实现

  1. public interface UserEntityDao {
  2. public void save(UserEntity user);
  3. }

定义一个biz和实现

  1. public class UserEntityBizImpl implements UserEntityBiz {
  2. private UserEntityDao dao;
  3.  
  4. @Override
  5. public void save(UserEntity user) {
  6. dao.save(user);
  7. }
  8.  
  9. public UserEntityDao getDao() {
  10. return dao;
  11. }
  12.  
  13. public void setDao(UserEntityDao dao) {
  14. this.dao = dao;
  15. }
  16.  
  17. }

创建前置增强类

  1. //通过methodBeforeAdvice实现前置增强
  2. public class LoggerBefore implements MethodBeforeAdvice {
  3.  
  4. private static final Logger logger = Logger.getLogger(LoggerBefore.class);
  5.  
  6. @Override
  7. public void before(Method method, Object[] arguments, Object target)
  8. throws Throwable {
  9. logger.info("调用" + target + "的" + method.getName() + "方法。" + "方法入参"
  10. + Arrays.toString(arguments));
  11. }
  12.  
  13. }

创建后置增强类

  1. //通过afterreturningadvice实现后置增强
  2. public class LoggerAfterReturning implements AfterReturningAdvice {
  3. private static final Logger logger = Logger
  4. .getLogger(LoggerAfterReturning.class);
  5.  
  6. @Override
  7. public void afterReturning(Object returnValue, Method method,
  8. Object[] arguments, Object target) throws Throwable {
  9. logger.info("调用" + target + "的" + method.getName() + "方法" + "方法返回值:"
  10. + returnValue);
  11. }
  12.  
  13. }

配置applicationContext.xml

  1. <!-- 声明要创建的实体类 -->
  2. <bean id="daoImpl" class="cn.cnsdhzzl.dao.impl.UserEntityDaoImpl"></bean>
  3.  
  4. <bean id="biz" class="cn.cnsdhzzl.biz.impl.UserEntityBizImpl">
  5. <property name="dao" ref="daoImpl"></property>
  6. </bean>
  7.  
  8. <bean id="loggerBefore" class="cn.cnsdhzzl.aop.LoggerBefore"></bean>
  9. <bean id="loggerAfterReturning" class="cn.cnsdhzzl.aop.LoggerAfterReturning"></bean>
  10.  
  11. <!-- 定义切入点 -->
  12. <aop:config>
  13. <aop:pointcut id="pointcut"
  14. expression="execution(public void save(cn.cnsdhzzl.entity.UserEntity))" />
  15. <!-- 插入增强处理(织入) -->
  16. <aop:advisor advice-ref="loggerBefore" pointcut-ref="pointcut" />
  17. <aop:advisor advice-ref="loggerAfterReturning"
  18. pointcut-ref="pointcut" />
  19. </aop:config>

注:

exection是切入点指示符,他的括号中是一个切入点表达式,可以配置要切入的方法,切入点表达式支持模糊匹配

 

  • 任意公共方法的执行:
    1. executionpublic * *(..))
  • 任何一个名字以“set”开始的方法的执行:
    1. execution(* set*(..))
  • AccountService接口定义的任意方法的执行:
    1. execution(* com.xyz.service.AccountService.*(..))
  • 在service包中定义的任意方法的执行:
    1. execution(* com.xyz.service.*.*(..))
  • 在service包或其子包中定义的任意方法的执行:
    1. execution(* com.xyz.service..*.*(..))
  • 在service包中的任意连接点(在Spring AOP中只是方法执行):
    1. withincom.xyz.service.*)
  • 在service包或其子包中的任意连接点(在Spring AOP中只是方法执行):
    1. withincom.xyz.service..*)
  • 实现了AccountService接口的代理对象的任意连接点 (在Spring AOP中只是方法执行):
    1. thiscom.xyz.service.AccountService
    'this'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得代理对象在通知体内可用。
     
  • 实现AccountService接口的目标对象的任意连接点 (在Spring AOP中只是方法执行):
    1. targetcom.xyz.service.AccountService
    'target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得目标对象在通知体内可用。
     
  • 任何一个只接受一个参数,并且运行时所传入的参数是Serializable 接口的连接点(在Spring AOP中只是方法执行)
    1. argsjava.io.Serializable
    'args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得方法参数在通知体内可用。
    请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args版本只有在动态运行时候传入参数是Serializable时才匹配,而execution版本在方法签名中声明只有一个 Serializable类型的参数时候匹配。
  • 目标对象中有一个 @Transactional 注解的任意连接点 (在Spring AOP中只是方法执行)
    1. @targetorg.springframework.transaction.annotation.Transactional
    '@target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。
     
  • 任何一个目标对象声明的类型有一个 @Transactional 注解的连接点 (在Spring AOP中只是方法执行):
    1. @withinorg.springframework.transaction.annotation.Transactional
    '@within'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。
     
  • 任何一个执行的方法有一个 @Transactional 注解的连接点 (在Spring AOP中只是方法执行)
    1. @annotationorg.springframework.transaction.annotation.Transactional
    '@annotation'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。
     
  • 任何一个只接受一个参数,并且运行时所传入的参数类型具有@Classified 注解的连接点(在Spring AOP中只是方法执行)
    1. @argscom.xyz.security.Classified
    '@args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。
     
  • 任何一个在名为'tradeService'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):
    1. beantradeService
  • 任何一个在名字匹配通配符表达式'*Service'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):
    1. bean(*Service

spring之初识Ioc&Aop的更多相关文章

  1. Spring 之初识IOC和DI

    下载Spring jar包 Spring官网 下载地址 Sping核心jar包 IOC简介 IOC:控制反转,指以前程序自己创建对象,现在将创建对象的控制权交给了第三方(Spring)了 IoC底层实 ...

  2. spring的长处 ioc aop

    spring 的长处? 1.减少了组件之间的耦合性 ,实现了软件各层之间的解耦 2.能够使用easy提供的众多服务.如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它非 ...

  3. spring ioc aop 原理

    spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...

  4. Spring学习笔记IOC与AOP实例

    Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...

  5. 对 Spring 的核心(AOP 和 IOC)的理解(大白话)

    Spring 首先它是一个开源而轻量级的框架.其核心容器的主要组件是Bean工厂(BeanFactory).Bean工厂使用控制反转(IOC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AO ...

  6. 详谈 Spring 中的 IOC 和 AOP

    这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...

  7. Spring中三个重要概念 IOC AOP Bean

    Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...

  8. (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

    Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...

  9. Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP

    1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...

随机推荐

  1. 粒子群算法 Particle Swarm Optimization, PSO(转贴收藏)

    粒子群算法(1)----粒子群算法简介 http://blog.csdn.net/niuyongjie/article/details/1569671 粒子群算法(2)----标准的粒子群算法 htt ...

  2. jenkins远程命令执行利用工具

    昨天看小飞侠写的py的jenkins的脚本,昨天晚上在微信里评论今天写一个JAVA的GUI的tools. 早上花了点时间写一下: code: package com.tools; import jav ...

  3. VSFTP安全加固

    这几天在公司需要做基线安全,一直都没有经验,所以在网上找了一些,做来参考学习. vsftp配置详解 这里是对vsftp配置文件的详细解释,主要参考了<RedHat8.0网络服务>一书中&l ...

  4. ORA-01009: 必需的参数缺失

    第一步:看看是否有参数没有配: 第二步:如果第一步没问题,那么请在英文半角下把sql语句重新写一遍 以上~

  5. hdu 4946 Just a Joke(数学+物理)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4969 Just a Joke Time Limit: 2000/1000 MS (Java/Others) ...

  6. 学习Berkeley DB- 入门

    1 导言 首先,我们要了解Berkeley DB的一些基本特性,在IBM的开发网站上有篇文章对其有比较清晰的介绍: 这篇文章讲到了BDB的设计思想和核心数据结构.以及数据访问算法:并有常用函数使用范例 ...

  7. C# 线程(一)

    From : http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www. ...

  8. 关于HTML5与移动开发

    OSChina API列表: android api:http://tool.oschina.net/apidocs AppCan移动开发平台:http://doc.appcan.cn/#!/guid ...

  9. Threejs 使用的3D格式

    3D格式你可以通过任意软件导出(.3ds,dae等),但是threejs 无法使用, 1,http://www.blender.org/ 下载这款开源的3d软件 2,https://github.co ...

  10. js学习笔记-编写高效、规范的js代码-Tom

    编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定 ...