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/beanshttp://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>

测试类:

    @Testpublic 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;@Overridepublic 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);@Overridepublic 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);@Overridepublic 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)

转载于:https://www.cnblogs.com/cnsdhzzl/p/5908779.html

spring之初识IocAop相关推荐

  1. Spring 01 初识 Spring

    初识 Spring 文章目录 初识 Spring 一.学习任务 二.本章目标 三.Spring框架简介 3.1.Spring框架作用与优点 3.2.Spring框架体系结构介绍 3.3.Spring框 ...

  2. 【Spring BootSpring Cloud系列】Spring Boot初识

    项目代码地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/Spring-boot-helloworld 一.Spring B ...

  3. Spring(1)—初识

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用. 特点: 轻量--从大小与开销两方面而言Spring都是轻量的. 控 ...

  4. Spring Boot初识(2)- Spring Boot整合Mybaties

    一.本文介绍 首先读这篇文章之前如果没有接触过Spring Boot可以看一下之前的文章,并且读这篇文章还需要你至少能写基本的sql语句.我在写这篇文章之前也想过到底是选择JPA还是Mybaties作 ...

  5. 【spring】初识aop(面向切面编程) 使用jdk动态代理

    BankServiceIImple.java 代码实现: package com.zzxtit.aop;import java.math.BigDecimal;public interface Ban ...

  6. javaweb实训第五天上午——Spring基础

    Spring基础 1.课程介绍 2.为什么需要Spring 3.初识Spring 3.1.什么是Spring 3.2.Spring框架的好处 3.3.Spring框架的模块化 4.Spring入门 4 ...

  7. Spring全集(上)

    Spring 1.初识spring 先看下结构图 核心容器:核心容器主要的组件是BeanFactory,它是工厂模式的实现.它使用的是控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序 ...

  8. springsecurity拦截ajax,Spring Security Ajax 被拦截

    背景是项目中使用Spring Security 进行安全控制 再使用Ajax的时候会报 403(ajax get  方式是没问题的 post 的时候会报) Spring Security 原本是 防止 ...

  9. Java之美[从菜鸟到高手演变]系列之博文阅读导航

    随着博文越来越多,为博客添加一个导航很有必要!本博客将相继开通Java.CloudFoundry.Linux.Ruby等专栏,都会设立目录,希望读者朋友们能更加方便的阅读! 在阅读的过程中有任何问题, ...

最新文章

  1. Java培训深度学习都要学什么
  2. Open Sans字体兼容问题解决办法[font-face]
  3. Play自动生成的项目目录简介
  4. tp5页面跳转,空控制器空方法
  5. 【机器视觉】 assign算子
  6. 实战渗透-Shiro反序列化漏洞实例
  7. 老大爷的手法一看就不一般!
  8. mysql用户名锁定_MySQL用户锁定
  9. 蓝桥杯单片机stc15f2k61s2矩阵按键中断扫描代码
  10. 在Java中调用Python,java面试题,java初级笔试题
  11. 优化理论19----DNRTR无约束优化的对角拟牛顿修正方法
  12. 单片机c语言表达式,单片机C语言教程:运算符和表达式(位运算符)
  13. 达梦数据库html管理,达梦数据库的管理 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. python反转整数的几种方法_小白python整数反转
  15. OpenGl法向量计算
  16. CSS 3之图文混排效果
  17. matlab单双极性眼图程序,求通信大神讲讲这个matlab程序每一段的意思
  18. 数据项组成数据元素,数据元素组成数据
  19. 等额本息贷款每月还款金额推导过程
  20. accept 和 content-Type区别

热门文章

  1. 什么是系统架构?系统架构的特点分析!
  2. 什么是引发?Java运行时系统引发的异常如何处理?
  3. python学习之老男孩python全栈第九期_day024知识点总结——单继承、多继承
  4. 优先级队列之PriorityQueue
  5. Linux shell 的条件 / 比较语法
  6. EF框架step by step(1)—Database-First
  7. Redis bind用法
  8. 下载并遍历 names.txt 文件,输出长度最长的回文人名。
  9. 程序员面试金典——7.3判断直线相交
  10. Pytorch常用技巧记录