文档库 最新最全的文档下载
当前位置:文档库 › spring--Ioc(注解方式)--单元测试--AOP

spring--Ioc(注解方式)--单元测试--AOP

spring--Ioc(注解方式)--单元测试--AOP
spring--Ioc(注解方式)--单元测试--AOP

一、Ioc容器装配Bean(注解方式)

Xml中的描述bean:

Spring2.5 引入使用注解去定义Bean

@Component(组件)描述Spring框架中Bean

应用Spring注解。

@Component : 只是让bean被spring管理,没有进行依赖注入。

除了@Component外,Spring提供了3个功能基本和@Component等效的注解。

@Repository 用于对DAO层实现类进行标注。

@Service 用于对Service层实现类进行标注。

@Controller 用于对控制器(action/servlet)实现类进行标注。

总结:@Component/@Repository/@Service/@Controller 的功能都是一模一样,主要是便于区分在哪一层。

第一步:

在需要被Spring管理的类上面添加@Component

如:

@Component

public class EmployeeDAOImpl implements IEmployeeDAO {}

第二步:

引入context命名空间.

xmlns:p="https://www.wendangku.net/doc/e618736822.html,/schema/p"

xmlns:context="https://www.wendangku.net/doc/e618736822.html,/schema/context"

xmlns:xsi="https://www.wendangku.net/doc/e618736822.html,/2001/XMLSchema-instance"

xsi:schemaLocation="

https://www.wendangku.net/doc/e618736822.html,/schema/beans

https://www.wendangku.net/doc/e618736822.html,/schema/beans/spring-beans.xsd

https://www.wendangku.net/doc/e618736822.html,/schema/context

https://www.wendangku.net/doc/e618736822.html,/schema/context/spring-context.xsd">

二、自动装配Bean(依赖注入)

@Autowired注入时可以针对成员"变量"或者"setter方法(属性)"

@Autowired 默认按照类型进行注入如果存在两个或者多个相同Bean类型相同,则按照(字段名称/属性的名称)名称注入。

@Qualifier("beanId")指定注入Bean的名称

使用Qualifier 指定Bean名称后,注解Bean必须指定相同名称

Spring提供对JSR-250中定义@Resource标准注解的支持

@Resource和@Autowired注解功能相似

//@Autowired

//@Qualifier("car1")//指定注入的bean的id

@Resource(name="car1")//指定注入的bean的id,等同于上面两句.(较常用)

注解配置生命周期方法:

初始化方法:

@PostConstruct 在构造方法执行之后执行

public void init(){

System.out.println("User init 初始化方法!");

}

销毁方法:

@PreDestroy 在bean销毁之前执行

public void destory(){

System.out.println("User destory 销毁方法!");

}

配置bean作用域

@Scope("prototype")//@Scope bean作用域,默认情况下是单例。Prototype为多例,如果

一个bean是prototype,那么spring不会对他进行管理。

多种装配Bean 方式比较:

三、Spring 应用Web 项目

第一步:导入jar 包

第二步:加入配置文件

web 使用spring.

初始化spring 方式一:

在servlet 的init 方法中完成。但是init 方法在第一次访问servlet 的时候 才 执行. @Override

public void init() throws ServletException {

System.out.println("Servlet 初始化,并且初始化Spring");

//通过spring 容器获取一个bean 对象

//第一步初始化spring 容器(工厂)

applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //把spring 放到web 的application 对象中。

getServletContext().setAttribute("applicationContext",applicationContext);

//在其他的servlet 中可以得到数据.

getServletContext().getAttribute("applicationContext");

}

初始化spring 方式二:

通过web listeners

ServletContextListener ->容器启动过程中调用该监听器。

基于XML 配置 基于注解配置 基于Java 类配置 Bean 定义 <bean id="..." class="..." /> @Component 衍生类

@Repository@Service @Controller

@Configuration 标注类,@Bean 标注提供Bean 方法 Bean 名称 通过 id 或name 指定

@Component("person") @Bean("person") Bean 注入 <property> 或者

通过p 命名空间 @Autowired 按类型注入 @Qualifier 按名称注入 在方法内部编写注入代码逻辑

生命过程、Bean 作用范

围 init-method destroy-method

范围 scope 属性 @PostConstruct 初始化方法 init() @PreDestroy 销毁方法destroy () @Scope 设置作用范围,单例或者多例

在方法内部调用初始化方法@Scope 指定范围 适合场景 Bean 来自第三方,使用其

它命名空间 Bean 的实现类由用户自己开发 实例化Bean 的逻辑比较复杂

(思路:

将Spring容器初始化,交由web容器负责

配置核心监听器ContextLoaderListener,

用来加载spring配置文件application-*.xml

配置全局参数contextConfigLocation (如:application-*.xml 配置文件)

用于指定Spring的框架的配置文件位置

web.xml

org.springframework.web.context.ContextLoaderListener

contextConfigLocation

classpath:applicationContext.xml

代码中使用:

AppliationContext context

= WebApplicationContextUtils.getWebApplicationContext(getServletContext());

context.getBean(beanId);

四、Junit4测试Spring

导入Spring test测试jar包

spring-test-3.2.0.RELEASE.jar

//如果不写"/"代表从(SpringTest)本测试类当前包作为根路径。

//写"/"代表从classpath的根查找

/**

* value , locations都是指spring配置文件的路径

*/

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("applicationContext.xml")//根据这个条件实例化一个application对象public class SpringTest {

@Autowired //自动去spring容器中找相同类型(这里是IUserService 类型)的对象

如果类型相同,就再根据名称去找,这里名称就是userService private IUserService userService;

@Test

public void demo1(){

System.out.println(userService);

}

@Test

public void demo2(){

System.out.println(userService);

}

}

五、spring aop

代理模式: 真实对象(房东),代理对象(N个中介),

抽象主题(真实和代理的共同接口)。

Jdk动态代理只支持接口代理。

CGLIB支持接口和类直接代理。

Spring在运行期,生成动态代理对象,不需要特殊的编译器

Spring AOP的底层就是通过JDK动态代理或CGLib动态代理技术为目标Bean执行横向织入

1.若目标对象实现了若干接口,spring使用JDK的https://www.wendangku.net/doc/e618736822.html,ng.reflect.Proxy类代理。

2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

1.什么是AOP?

AOP 面向切面编程!

AOP采取横向抽取机制!

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码(即通知)。

2.AOP相关术语

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.

Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint(连接点)进行拦截的定义.

Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

Target(目标对象):代理的目标对象(即真实对象),也就是被代理对象

Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.

spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

Aspect(切面): 是切入点和通知的结合切面=切点+通知

3.Spring AOP增强类型

AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice

Spring按照通知Advice在目标类方法的连接点位置,可以分为5类

前置通知org.springframework.aop.MethodBeforeAdvice

在目标对象的方法执行前实施增强

后置通知org.springframework.aop.AfterReturningAdvice

在目标方法执行后实施增强

环绕通知org.aopalliance.intercept.MethodInterceptor

在目标方法执行前后实施增强

异常抛出通知org.springframework.aop.ThrowsAdvice

在方法抛出异常后实施增强

引介通知org.springframework.aop.IntroductionInterceptor

在目标类中添加一些新的方法和属性

4.Service使用spring aop添加写日志的功能

第一步:

https://www.wendangku.net/doc/e618736822.html,.aopalliance-1.0.0.jar (aop规范)

spring-aop-3.2.0.RELEASE.jar

第二步:

配置需要通过spring代理的类。

第三步:

编写通知(功能)代码

前置通知、后置通知.......

第四步:

配置代理:

Spring提供一个类ProxyFactoryBean(代理工厂bean),生产代理对象。

第五步:

id="userServiceProxy"

class="org.springframework.aop.framework.ProxyFactoryBean">

logAdvice

sh.itcast.spring.aop.base.IUserService

补充web.xml知识:

context-param和init-param区别:

web.xml里面可以定义两种参数:

(1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下:

context/param

avalible during application

(2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:

MainServlet

com.wes.controller.MainServlet

param1

avalible in servlet init()

0

在servlet中可以通过代码分别取用:

package com.wes.controller;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

public class MainServlet extends HttpServlet ...{

public MainServlet() ...{

super();

}

public void init() throws ServletException ...{

System.out.println("下面的两个参数param1是在servlet中存放的");

System.out.println(this.getInitParameter("param1"));

System.out.println("下面的参数是存放在servletcontext中的");

System.out.println(getServletContext().getInitParameter("context/param"));

}

}

第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得.

相关文档