`

spring简介2

 
阅读更多

5.各种类型数据的注入

1)基本数据注入

利用value属性指定,可以注入字符串,数值等简单数据。

*2)Bean对象注入

利用ref属性指定,可以注入一个Bean组件对象

<bean id="hibernateCostDao" class="com.tarena.dao.HibernateCostDAO">

</bean>

<!-- setter方式注入示例 -->

<bean id="costAction" scope="prototype"

class="com.tarena.action.CostAction">

<!-- 将ref指定的id属性Bean对象给costDao属性注入 -->

<property name="costDao" ref="hibernateCostDao">

</property>

</bean>

3)集合数据注入

eg:

applicationContext.xml配置如下:

<bean id="msgBean" scope="singleton"

class="com.tarena.service.MessageBean">

<!-- 基本数据注入 -->

<property name="name" value="露丝">

</property>

<!-- 其中,value值的类型全部为String型,对于age属性来说,其类型为Int

型,在属性注入时Spring会自动进行类型转换(String—>int)

-->

<property name="age" value="18">

</property>

<!-- List集合注入 -->

<property name="friends">

<list>

<value>TOM</value>

<value>JACK</value>

<value>张三丰</value>

</list>

</property>

<!-- Set集合注入 -->

<property name="cities">

<set>

<value>北京</value>

<value>上海</value>

<value>深圳</value>

</set>

</property>

<property name="includeTypes" value="jpeg,gif,jpg">

</property>

<!-- Map集合注入 -->

<property name="books">

<map>

<entry key="1001" value="Core Java基础"></entry>

<entry key="1002" value="Struts框架详解"></entry>

<entry key="1003" value="编程之美"></entry>

</map>Spring经典总结

</property>

<!-- Properties(本质是Map)属性注入 -->

<property name="dbParams">

<props>

<prop key="username">root</prop>

<prop key="password">1234</prop>

</props>

</property>

</bean>

测试类代码:

public class MessageBean {

private String name;

private int age;

private List<String> friends;

private Set<String> cities;

private Set<String> types;

private Map<Integer, String> books;

private Properties dbParams;

 

public void setDbParams(Properties dbParams) {

this.dbParams = dbParams;

}

Spring经典总结

public void setIncludeTypes(String str) {

String[] arr = str.split(",");

types = new HashSet<String>();

for (String type : arr) {

types.add(type);

}

}

 

public void setCities(Set<String> cities) {

this.cities = cities;

}

 

public void setFriends(List<String> friends) {

this.friends = friends;

}

 

public void show() {

/**基本数据注入测试*/

System.out.println("姓名:" + name);

System.out.println("年龄:" + age);

/**List注入测试*/

System.out.println("---她的朋友---");

for (String s : friends) {

System.out.println(s);

}

/**Set集合注入测试*/

System.out.println("---他们所在城市---");

for (String s : cities) {

System.out.println(s);

}

System.out.println("---允许上传的图片类型---");

for (String s : types) {

System.out.println(s);

}

/**Map集合注入测试*/

System.out.println("-----图书信息-----");

Set<Integer> keys = books.keySet();

for (Integer key : keys) {

System.out.println("编号:" + key + " 名字:" + books.get(key));

}

/**Properties注入测试*/

System.out.println("----连接参数-----");

Set<Object> dbKeys = dbParams.keySet();

for (Object key : dbKeys) {

System.out.println(key + ":" + dbParams.getProperty(key.toString()));

}

}

public void setAge(int age) {

this.age = age;

}

public void setName(String name) {

this.name = name;

}

public void setBooks(Map<Integer, String> books) {

this.books = books;

}

}

*6.什么是AOP,解决什么问题

Aspect Oriented Programming 面向方面编程也叫面向切面编程

面向方面编程是以(OOP)面向对象编程为基础,这两种编程思想侧重点不同。OOP侧重于对象,根据需求提炼出对象结构。AOP侧重于方面对象,方面(共同处理组件)关注的是共通处理部分,例如事务管理,权限控制,日志记录等。可以通过配置将其作用到某一个或多个目标对象上。好处是实现组件重复利用,改善程序结构,提高灵活性。将共同处理组件与目标对象解耦。

AOP主要是解决一对多调用问题,一个共通组件被多个目标组件调用,降低组件关联。

*7.Spring容器AOP的基本使用

1)引入spring-aop开发包

2)编写方面组件,封装共通的处理逻辑

3)在spring配置文件中,定义方面组件,利用aop配置,将方面组件方

法和目标组件方法作用在一起。

8. AOP相关概念

*1)方面(Aspect)

方面(组件)指的是共同业务处理,可以切入到(即作用到)多个目标

对象,可以多次使用。

*2)切入点(Pointcut)

切入点是连接点(Pintcut)的集合,采用表达式指定,用于指定哪些

组件和方法作为方面组件的切入目标。

*1)方法限定表达式

可以规定哪些方法被切入方面组件,哪些不被切入,也就是

定义目标对象,格式如下:

execution(修饰符? 返回类型 方法名(参数) throws异常? )

示例1:匹配容器中Bean对象的find开始的方法

execution(* find*(..))

第一个“*”表示返回类型不限,"find*"表示以“find

”开头的所有方法,".."表示一个或多个参数(也即参

数不限)

示例2:匹配CostServiceImpl类中所有方法

execution(* tarena.service.CostServiceImpl.*(..))

示例3:匹配tarena.service包下所有类的所有方法

execution(* tarena.service.*.*(..))

示例4:匹配tarena.service包及其子包下所有类所有方法

execution(* tarena.service..*.*(..))

示例5:匹配容器Bean对象中的find开始的方法,并且是 public void 修饰的

execution(public void find*(..))

*2.类型限定表达式

可以规定哪个类中的所有方法被切入方面组件

格式:within(包名.类型名)

示例1:匹配CostServiceImpl类中所有方法

within(tarena.service.CostServiceImpl)

示例2:匹配tarena.service包下所有类所有方法

within(tarena.service.*)

示例3:匹配tarena.service包及其子包中所有类所有方法

within(tarena.service..*)

3.Bean的Id或Name名称限定

可以按<bean>定义时,id或name属性值匹配

bean(beanIdOrName)

示例1:匹配容器中id=costService的Bean对象

bean(costService)

示例2:匹配容器中id值以Service结尾的对象

bean(*Service)

4.参数类型限定

args(参数类型列表)

示例1:匹配有且只有一个参数,参数类型符合

Serializable类型的方法

args(java.io.Serializable)

*注意:上述切入点表达式可以联合使用,采用&&,||连接

3)连接点(JoinPoint)

// 连接点的集合组成切入点,连接点指的是切面组件在目标对象上 // 作用的位置,例如:在方法调用前、方法调用后、或者发生异常。

切入点是连接点的集合。代表方面组件和某一个目标方法的关联点。

*4)通知(Advice)

用于指定方面组件作用于目标对象中的目标方法的时机。例如前置

通知,意思是先执行方面组件,再执行目标方法。

Spring提供了5种类型的通知。用于指定方面组件在目标方法哪个

位置切入。Spring经典总结

a.前置通知 <aop:before>

先执行方面组件,再执行目标组件方法

b.后置通知 <aop:after-returning>

先执行目标组件方法,没有异常再执行方面组件。

如果发生异常,不会执行方面组件

c.异常通知 <aop:after-throwing>

当目标方法抛出异常之后,执行方面组件。

d.最终通知 <aop:after>

先执行目标方法,无论有没有异常都执行方面组件

e.环绕通知 <aop:around>

相当于前置+后置通知。在目标方法前和后都执行方面组件

内部实现原理:

try{

//前置通知切入

//环绕前置通知切入

//目标组件方法

//环绕后置通知切入

//后置通知切入

}catch(){

//异常通知切入

}finally{

//最终通知切入

}

5)目标对象(Target)

方面组件作用的对象,即与切入点表达式匹配的对象。

6)动态代理(AutoProxy)

Spring采用了动态代理技术实现了AOP控制

如果Spring采用了AOP配置后,容器getBean方法返回的组件对象

是代理对象(一个动态生成类型,即动态代理类),用户在使用时,由

代理对象调用切面组件和目标对象的功能。

Spring采用的动态代理技术有以下两种:

a.目标对象没有接口(使用cglib.jar工具包)

适用于目标组件没有接口实现的情况。

public class $Service$$Enhancer$CGLIB extends

原目标组件类型{

//重写目标对象的方法,在重写的方法中调用目标对象和方面组 件对象功能

}

b.目标对象有接口(采用JDK Proxy API)

适用于目标组件有接口实现的情况。

public class $Proxy4 implements 原目标组件接口{

//重写目标接口方法,在重写的方法中调用目标对象和方面组件对

象功能

}

public void testDelete() {

String[] confs = { "applicationContext.xml" };

ApplicationContext ac = new ClassPathXmlApplicationContext(confs);

CostService service = (CostService) ac.getBean("costService");

System.out.println("类名:"+service.getClass().getName());

//获得代理类中的所有public方法

Method[] ms =service.getClass().getMethods();

for(Method m : ms){

System.out.println(m);

}

service.deleteCost();

}Spring经典总结

程序运行结果如下:

类名:$Proxy4

public final void $Proxy4.addCost()

public final void $Proxy4.deleteCost()

public final void $Proxy4.findById()

public final boolean $Proxy4.isFrozen()

public final org.springframework.aop.TargetSource

$Proxy4.getTargetSource()

public final void

$Proxy4.addAdvisor(int,org.springframework.aop.Advisor)

 

从以上结果可以看出,动态代理类中重写了原实现类中的

addCost()、deleteCost()、findById()方法并加入了方面(共同

处理的方法),这样就可以实现对目标对象实现方面切入。

分享到:
评论

相关推荐

    Spring 简介 Spring 简介

    2. 定义接口,代表业务逻辑。 3. 实现接口,创建一个或多个实现类。 4. 编写配置文件,声明Bean及其依赖关系。 5. 编写测试代码,验证Spring容器是否能正确管理和调用Bean。 在日志方面,Spring 常常配合log4j使用...

    Spring Cloud之一 Spring Cloud简介

    2. Spring Cloud Bus:用于在分布式系统中传播状态变化(比如配置文件的修改)的事件总线,可以与Spring Cloud Config配合使用,实现配置的热更新。 3. Spring Cloud Netflix:集成了Netflix提供的多个组件,例如:...

    SSM框架教程Spring+SpringMVC+MyBatis全覆盖_Java热门框架视频教程

    1、Spring简介及快速入门 2、Spring配置文件及其相应API 3、Spring注解开发 4、Spring web环境及其Junit的集成 5、Spring JDBCTemplate的基本使用 6、Spring AOP的介绍及其配置使用 7、Spring的声明式事务控制 8、...

    Spring简介

    Spring主要项目,从配置到安全,从Web应用到大数据 - 无论您的应用程序需要什么样的基础架构,都有一个Spring项目可以帮助您构建它。从小处着手,只使用你需要的东西 - Spring是模块化的设计。 Spring指南 无论您...

    Spring Boot 2.X 实战教程.pdf

    本课程内容包括Spring简介、Spring Boot简介、安装JDK、安装Maven、第一个Spring Boot程序(使用Spring Initializr构建、Spring Boot代码讲解、安装Notepad++)、构建系统、代码、配置、三种方式运行程序、安装...

    Java Spring入门简介

    Java Spring框架是一个非常流行的开源框架,主要用于简化Java应用的开发。Spring为Java提供了全面的编程和配置模型,从而可以创建出简单、可靠且可测试的代码。Spring框架的核心特性包括依赖注入(DI)、面向切面编程...

    01.Spring框架简介_spring_spring发展历程_

    **Spring框架简介** Spring框架是Java开发领域中最广泛使用的轻量级框架之一,自2003年首次发布以来,它极大地推动了企业级Java应用的发展。Spring的主要目标是简化Java开发,通过提供一个全面的编程和配置模型,...

    spring framework 简介

    ### Spring Framework 简介 #### 一、Spring Framework 的独特之处 在众多J2EE框架中,Spring Framework 自2003年发布以来一直备受瞩目。与其他框架相比,Spring Framework 的独特之处在于: 1. **专注于管理业务...

    SSH和Spring框架简介

    通过阅读"SSH框架简介.doc"和"Spring框架简介.doc",你可以深入理解这两个框架的工作原理、优缺点及应用场景,为你的Java开发之路打下坚实基础。在学习过程中,实践是关键,尝试创建小型项目,将理论知识转化为实际...

    Spring简介+IOC(理论).ppt

    Spring简介+IOC(理论 Spring简介+IOC(理论 Spring简介+IOC(理论 Spring简介+IOC(理论 Spring简介+IOC(理论 Spring简介+IOC(理论

    Spring Annotation简介一

    【Spring Annotation简介一】 在Java开发领域,Spring框架以其强大的功能和灵活性深受广大开发者喜爱。Spring Annotation是Spring框架中的一个重要特性,它极大地简化了配置,提高了代码的可读性和可维护性。这篇...

    Spring 简介 轻量级的J2EE 应用程序框架

    #### 一、Spring框架简介 Spring框架是一个开源的轻量级Java应用框架,主要用于简化企业级应用开发。它通过提供一系列的开发工具和服务,帮助开发者构建灵活、可扩展的应用系统。 #### 二、Spring的核心功能 ...

    Struts2+spring注解配置简介

    Struts2和Spring是两个非常重要的Java开源框架,它们在企业级Web开发中扮演着核心角色。Struts2主要用于处理MVC(Model-View-Controller)架构中的控制器部分,而Spring则是一个全面的后端解决方案,包括依赖注入、...

    JAVA Spring 10、Spring简介.pdf

    JAVA Spring 10、Spring简介.pdf

    Spring Data简介

    **Spring Data 概述** Spring Data 是一个广受欢迎的开源框架,它简化了与数据库的交互,特别是对于Java开发者而言。这个框架的核心目标是通过提供一个一致的编程模型和简单的API来减少数据访问层的复杂性,使得...

    spring boot、spring cloud、spring boot Alibaba以及配套组件版本关系

    #### 三、Spring Boot Alibaba简介 - **Spring Boot Alibaba**:是由阿里巴巴开发并维护的一套基于Spring Boot和Spring Cloud的微服务解决方案,提供了对阿里云服务的集成支持,例如Nacos、Sentinel、RocketMQ等。 ...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    ### Spring框架简介 Spring框架是一个开源的企业级Java应用程序框架,由Rod Johnson创建,现由Pivotal软件公司支持。Spring框架最初是为了简化企业应用开发而设计的,它提供了一种轻量级的方式来管理依赖注入...

    中软国际Spring简介

    **Spring框架概述** Spring是一个开源的Java平台,它主要为构建企业级应用提供全面的解决方案。这个框架由Rod Johnson在2003年发起,旨在简化Java开发,尤其是在企业级应用开发中的复杂性。Spring的核心设计理念是...

Global site tag (gtag.js) - Google Analytics