spring之初识IocAop
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相关推荐
- Spring 01 初识 Spring
初识 Spring 文章目录 初识 Spring 一.学习任务 二.本章目标 三.Spring框架简介 3.1.Spring框架作用与优点 3.2.Spring框架体系结构介绍 3.3.Spring框 ...
- 【Spring BootSpring Cloud系列】Spring Boot初识
项目代码地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/Spring-boot-helloworld 一.Spring B ...
- Spring(1)—初识
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用. 特点: 轻量--从大小与开销两方面而言Spring都是轻量的. 控 ...
- Spring Boot初识(2)- Spring Boot整合Mybaties
一.本文介绍 首先读这篇文章之前如果没有接触过Spring Boot可以看一下之前的文章,并且读这篇文章还需要你至少能写基本的sql语句.我在写这篇文章之前也想过到底是选择JPA还是Mybaties作 ...
- 【spring】初识aop(面向切面编程) 使用jdk动态代理
BankServiceIImple.java 代码实现: package com.zzxtit.aop;import java.math.BigDecimal;public interface Ban ...
- javaweb实训第五天上午——Spring基础
Spring基础 1.课程介绍 2.为什么需要Spring 3.初识Spring 3.1.什么是Spring 3.2.Spring框架的好处 3.3.Spring框架的模块化 4.Spring入门 4 ...
- Spring全集(上)
Spring 1.初识spring 先看下结构图 核心容器:核心容器主要的组件是BeanFactory,它是工厂模式的实现.它使用的是控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序 ...
- springsecurity拦截ajax,Spring Security Ajax 被拦截
背景是项目中使用Spring Security 进行安全控制 再使用Ajax的时候会报 403(ajax get 方式是没问题的 post 的时候会报) Spring Security 原本是 防止 ...
- Java之美[从菜鸟到高手演变]系列之博文阅读导航
随着博文越来越多,为博客添加一个导航很有必要!本博客将相继开通Java.CloudFoundry.Linux.Ruby等专栏,都会设立目录,希望读者朋友们能更加方便的阅读! 在阅读的过程中有任何问题, ...
最新文章
- Java培训深度学习都要学什么
- Open Sans字体兼容问题解决办法[font-face]
- Play自动生成的项目目录简介
- tp5页面跳转,空控制器空方法
- 【机器视觉】 assign算子
- 实战渗透-Shiro反序列化漏洞实例
- 老大爷的手法一看就不一般!
- mysql用户名锁定_MySQL用户锁定
- 蓝桥杯单片机stc15f2k61s2矩阵按键中断扫描代码
- 在Java中调用Python,java面试题,java初级笔试题
- 优化理论19----DNRTR无约束优化的对角拟牛顿修正方法
- 单片机c语言表达式,单片机C语言教程:运算符和表达式(位运算符)
- 达梦数据库html管理,达梦数据库的管理 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...
- python反转整数的几种方法_小白python整数反转
- OpenGl法向量计算
- CSS 3之图文混排效果
- matlab单双极性眼图程序,求通信大神讲讲这个matlab程序每一段的意思
- 数据项组成数据元素,数据元素组成数据
- 等额本息贷款每月还款金额推导过程
- accept 和 content-Type区别