Spring是什么:
Spring是一个轻量级的DI和AOP容器框架,非侵入式,基于spring开发的应用一般不依赖于spring的类。
DI:称作依赖注入(Dependency Injection),和 IOC(控制反转)一个概念,创建被调用对象有Spring来完成,在容器实例化对象的时候主动的将被调用者(或者说它的依赖对象)注入给调用对象,因此又叫依赖注入。
AOP:Spring对面向切面编程提供了强有力的支持,通过它让我们将业务逻辑从应用服务(如事务管理)中分离出来,实现了高内聚开发,应用对象只关注业务逻辑,不再负责其它系统问题(如日志、事务等)。
容器:Spring是个容器,因为它包含并且管理应用对象的生命周期和配置。如对象的创建、销毁、回调等。
框架:Spring作为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专注于开发应用逻辑。
Spring的优点
1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
2.可以提供众多服务,事务管理,WS等。
3.AOP的很好支持,方便面向切面编程。
4.对主流的框架提供了很好的集成支持,如Hibernate,Struts2,JPA等
5.Spring DI机制降低了业务对象替换的复杂性。
6.Spring属于低侵入,代码污染极低。
7.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部
下面直接列举spring demo
public interface Axe {
public String chop();
}
public interface Person {
public void useAxe();
}
@Service
public class StoneAxe implements Axe {
public String chop() {
return "慢";
}
}
//@Service
public class SteelAxe implements Axe {
public String chop() {
return "快";
}
}
@Service
public class Chinese implements Person {
@Resource
private Axe axe;
public void setAxe(Axe axe) {
this.axe = axe;
}
public void useAxe() {
System.out.println(axe.chop());
}
}
bean.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="springDemo"></context:component-scan>
<context:annotation-config />
</beans>
客户端调用
@Test
public void springTestAxe() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"bean.xml");
Chinese chinese = context.getBean("chinese", Chinese.class);
chinese.useAxe();
}
maven
jar包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit-dep</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
日志管理 AOP
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="springDemo"></context:component-scan>
<context:annotation-config />
<aop:config>
<aop:pointcut id="servicepointcut"
expression="execution(* springDemo.*.*.*(..))" />
<aop:aspect id="loggeraspect" ref="optLogger">
<aop:before method="logger" pointcut-ref="servicepointcut" />
</aop:aspect>
</aop:config>
<!--
proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,
当配为<aop:aspectj-autoproxy poxy-target-class="true"/>时,表示使用CGLib动态代理技术织入增强。
不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。
-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>
日志处理类
@Service
public class OptLogger {
// public void logger() {
// System.out.println("开始记录日志。。。");
// }
public Object logger(ProceedingJoinPoint pjp) throws Throwable {
// proceed()方法有执行目标对象的功能
Object obj = pjp.proceed();
// 获取方法名
String method = pjp.getSignature().getName();
// 获取目标对象类名称
String clazzName = pjp.getTarget().getClass().getName();
String key = clazzName + "." + method;
PropertiesUtil.getInstance("opt.properties");
System.out.println("执行了" + PropertiesUtil.getProperty(key));
return obj;
}
}
PropertiesUtil 用于读取配置文件
public class PropertiesUtil {
static Properties props = new Properties();
private PropertiesUtil() {
}
public static Properties getInstance(String path) throws IOException {
props.load(PropertiesUtil.class.getClassLoader().getResourceAsStream(
path));
return props;
}
public static String getProperty(String key) {
String val = "";
if (props != null) {
String prop = props.getProperty(key);
if (prop != null) {
val = prop;
}
}
return val;
}
}
opt.properties 文件
springDemo.inter.impl.StoneAxe.chop=\u67E5\u8BE2 |
客户端调用代码不变
通知类型
1) 前置通知
<aop:before>
在目标方法调用之前执行。不能阻止后续执行,除非抛异常
2) 后置通知
<aop:after-returning>
在目标方法调用之后执行。目标方法正常结束才执行。
3) 最终通知
<aop:after>
在目标方法调用之后执行。目标方法正常或异常都执行。
4) 异常通知
<aop:after-throwing>
在目标方法调用发生异常之后执行。
5) 环绕通知
<aop:around>
在目标方法调用之前和之后执行。
这 5 种类型的通知,在内部调用时这样组织
try{
调用前置通知
环绕前置处理
调用目标对象方法
环绕后置处理
调用后置通知
}catch(Exception e){
调用异常通知
}finally{
调用最终通知
}
分享到:
相关推荐
《SpringDemo-master.zip:深入解析Spring与MyBatis集成应用》 在当今的Java开发领域,Spring框架以其强大的功能和灵活的设计理念,成为了企业级应用的首选。而MyBatis作为一个轻量级的持久层框架,以其简洁易用的...
这个“spring demo”资源显然旨在帮助开发者更好地理解和使用 Spring 框架。以下是对 Spring 框架核心知识点的详细说明: 1. **依赖注入(Dependency Injection, DI)**:Spring 的核心特性之一,通过DI,对象之间...
SpringDemo 入门学习代码
《Spring框架深度解析——基于"springDemo"实例》 在Java世界中,Spring框架以其强大的功能和灵活性,已经成为企业级应用开发的首选。本篇文章将深入探讨由"springDemo"项目提供的实例,来揭示Spring的核心特性及其...
在本文中,我们将深入探讨"最简单的Spring Demo",这是一个基于Spring框架的入门级实例,旨在帮助初学者快速理解Spring的核心概念。Spring是Java企业级应用开发中的一个关键框架,它提供了一整套服务,包括依赖注入...
标题“Spring demo”和描述“spring bug demo, hehe”暗示了我们将探讨Spring框架中的一个错误或问题,以及如何通过示例来解决它。Spring是一个广泛使用的Java企业级应用程序开发框架,尤其在构建面向服务的架构...
"SpringDemo"这个项目很可能是为了演示Spring框架的基本使用和功能。 在"SPRING的一个小例子"的描述中,我们可以推测这个项目包含了一些基本的Spring配置和示例代码,可能涉及以下几个关键知识点: 1. **Spring...
这个"spring demo"压缩包提供了一个完整的示例,其中包含了运行Spring应用程序所需的全部JAR文件,这意味着你无需额外下载任何依赖就能在Eclipse集成开发环境中直接进行运行和调试。 **Spring 框架的核心概念** 1....
在Spring框架中,自动检测注解(Autowired)是核心特性之一,它极大地简化了依赖注入的过程,使得开发者能够更加专注于业务逻辑,而不是繁琐的配置。本文将深入探讨Spring中的自动检测注解及其工作原理。 首先,`@...
"SpringDemo01"是一个入门级别的示例,旨在帮助初学者理解并掌握Spring框架的基础用法。 1. **依赖注入(DI)**:Spring通过DI来管理对象及其相互之间的依赖关系。它允许开发者在运行时动态地将依赖关系注入到对象...
《SpringDemo 源码解析》 在 IT 领域,Spring 框架以其强大的功能和灵活性,成为 Java 开发者最常使用的框架之一。"source of springdemo" 提供了 SpringDemo 的源码,这是一个绝佳的学习和研究 Spring 框架实际...
SpringBoot Demo是一个基于Spring Boot框架的示例项目,它展示了如何集成不同的技术栈来构建一个完整的应用程序。这个项目包括了MyBatis作为持久层框架、Lombok用于简化对象的创建、Swagger用于API文档的生成以及...
【标题】"Jersey+Spring Demo" 是一个基于Java的Web服务开发实例,它整合了两个重要的技术框架:Jersey和Spring。这个示例旨在帮助开发者理解如何在J2EE环境中构建RESTful Web服务,同时利用Spring框架进行依赖注入...
"springDemo初学入门"这个主题旨在引导初学者掌握Spring框架的基本用法。在这个压缩包中,可能包含了一个简单的Spring项目实例——myWebProject,这是一个基础的Web项目,用于演示Spring的核心功能。 1. **Spring...
MyBatis+SpringDemo项目是一个综合性的开发示例,它结合了MyBatis和Spring框架,展示如何在实际开发中整合这两个强大的工具,实现数据访问层(DAO)的操作。在这个项目中,我们将深入探讨MyBatis和Spring的核心概念...