一、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
代码中使用:
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">
补充web.xml知识:
context-param和init-param区别:
web.xml里面可以定义两种参数:
(1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下:
(2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:
在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")取得.