`

Spring Demo

 
阅读更多

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

    《SpringDemo-master.zip:深入解析Spring与MyBatis集成应用》 在当今的Java开发领域,Spring框架以其强大的功能和灵活的设计理念,成为了企业级应用的首选。而MyBatis作为一个轻量级的持久层框架,以其简洁易用的...

    spring demo

    这个“spring demo”资源显然旨在帮助开发者更好地理解和使用 Spring 框架。以下是对 Spring 框架核心知识点的详细说明: 1. **依赖注入(Dependency Injection, DI)**:Spring 的核心特性之一,通过DI,对象之间...

    SpringDemo 入门学习代码

    SpringDemo 入门学习代码

    springDemo

    《Spring框架深度解析——基于"springDemo"实例》 在Java世界中,Spring框架以其强大的功能和灵活性,已经成为企业级应用开发的首选。本篇文章将深入探讨由"springDemo"项目提供的实例,来揭示Spring的核心特性及其...

    最简单的spring demo

    在本文中,我们将深入探讨"最简单的Spring Demo",这是一个基于Spring框架的入门级实例,旨在帮助初学者快速理解Spring的核心概念。Spring是Java企业级应用开发中的一个关键框架,它提供了一整套服务,包括依赖注入...

    Spring demo

    标题“Spring demo”和描述“spring bug demo, hehe”暗示了我们将探讨Spring框架中的一个错误或问题,以及如何通过示例来解决它。Spring是一个广泛使用的Java企业级应用程序开发框架,尤其在构建面向服务的架构...

    SpringDemo

    "SpringDemo"这个项目很可能是为了演示Spring框架的基本使用和功能。 在"SPRING的一个小例子"的描述中,我们可以推测这个项目包含了一些基本的Spring配置和示例代码,可能涉及以下几个关键知识点: 1. **Spring...

    spring demo,包含了完整jar

    这个"spring demo"压缩包提供了一个完整的示例,其中包含了运行Spring应用程序所需的全部JAR文件,这意味着你无需额外下载任何依赖就能在Eclipse集成开发环境中直接进行运行和调试。 **Spring 框架的核心概念** 1....

    Spring demo 自动检测注解

    在Spring框架中,自动检测注解(Autowired)是核心特性之一,它极大地简化了依赖注入的过程,使得开发者能够更加专注于业务逻辑,而不是繁琐的配置。本文将深入探讨Spring中的自动检测注解及其工作原理。 首先,`@...

    SpringDemo01

    "SpringDemo01"是一个入门级别的示例,旨在帮助初学者理解并掌握Spring框架的基础用法。 1. **依赖注入(DI)**:Spring通过DI来管理对象及其相互之间的依赖关系。它允许开发者在运行时动态地将依赖关系注入到对象...

    source of springdemo

    《SpringDemo 源码解析》 在 IT 领域,Spring 框架以其强大的功能和灵活性,成为 Java 开发者最常使用的框架之一。"source of springdemo" 提供了 SpringDemo 的源码,这是一个绝佳的学习和研究 Spring 框架实际...

    springdemo

    SpringBoot Demo是一个基于Spring Boot框架的示例项目,它展示了如何集成不同的技术栈来构建一个完整的应用程序。这个项目包括了MyBatis作为持久层框架、Lombok用于简化对象的创建、Swagger用于API文档的生成以及...

    Jersey+spring Demo

    【标题】"Jersey+Spring Demo" 是一个基于Java的Web服务开发实例,它整合了两个重要的技术框架:Jersey和Spring。这个示例旨在帮助开发者理解如何在J2EE环境中构建RESTful Web服务,同时利用Spring框架进行依赖注入...

    springDemo初学入门

    "springDemo初学入门"这个主题旨在引导初学者掌握Spring框架的基本用法。在这个压缩包中,可能包含了一个简单的Spring项目实例——myWebProject,这是一个基础的Web项目,用于演示Spring的核心功能。 1. **Spring...

    MyBatis+SpringDemo项目

    MyBatis+SpringDemo项目是一个综合性的开发示例,它结合了MyBatis和Spring框架,展示如何在实际开发中整合这两个强大的工具,实现数据访问层(DAO)的操作。在这个项目中,我们将深入探讨MyBatis和Spring的核心概念...

Global site tag (gtag.js) - Google Analytics