导读
1.Spring作用域
2.基于注解的依赖注入
3.AOP:面向切面编程
Spring作用域
1.singleton:只生成一个实例(容器生成~容器销毁)
2.prototype:每次调用会生成不同的实例(每次请求)
以下在web应用中使用:
3.request:每次请求生成一个实例
4.session:每次会话生成一个实例
5.global-session: 在portlet web中使用
Bean的生命周期
1.singleton类型实例,是在容器加载时生成,在容器关闭时销毁,生成实例会调用init()方法,销毁时调用destroy()方法,destroy()方法只在对象作用域为singleton时才会调用
2.Prototype类型实例,是在每次请求时生成,是由java虚拟机自己销毁,所以不会调用destroy()方法
基于注解的依赖注入
@Component
@Autowired//自动注入,放到属性上默认根据byType注入,如果匹配有误,则根据byName
//放到set方法上,根据set方法注入
@Scope
@Value
@Service //一般运用在业务层,与@Component用法作用一致
@Repository //一般运用在持久层,可以封装一些SQL异常,与@Component用法作用一致
@Controller // 一般运用在控制层,与@Component用法作用一致
@Resource //不是由spring提供,由javaEE提供,与@Autowired用法作用基本相同,不同的地方在于
放到属性上默认根据byName注入,如果匹配有误,则根据byType
spring.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 扫描@Component注解,并生成实例加入到Spring容器 -->
<!-- base-package表示扫描指定的包及其子包 -->
<context:component-scan base-package="com.hala.entity"></context:component-scan>
</beans>
Book.java
package com.hala.entity;
import org.springframework.stereotype.Component;
@Component
public class Book {
public void read() {
System.out.println("冰与火之歌");
}
}
Mouse.java
package com.hala.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
//相当于<bean id="mouse" class="com.hala.entity.Mouse"></bean>
@Component("mouse")//不加的话默认为类的名字,首字母小写
@Scope("singleton")//指定bean的作用域,默认为singleton
public class Mouse {
@Value("Jerry")//注入一个值
private String name;
@Autowired//将book对象自动注入到Mouse
private Book book;
public void run() {
System.out.println(name+"老鼠在跑");
}
public void readBook() {
book.read();
System.out.println("老鼠爱读书");
}
}
MouseTest.java
package com.hala.test;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hala.entity.Mouse;
public class MouseTest {
ClassPathXmlApplicationContext bf=new ClassPathXmlApplicationContext("spring.xml");
// @Test
public void run() {
Mouse mouse=(Mouse)bf.getBean("mouse");
mouse.run();
}
@Test
public void readBook() {
Mouse mouse=(Mouse)bf.getBean("mouse");
mouse.readBook();;
}
}
AOP:面向切面编程
在原来jar包基础上添加以下四个jar包
1.切入点pointcut,Spring中的aop切入点,是精确到具体的方法,所以切入点的单位是方法
2.切面:aspect
3.通知:
before:在切入点到达之前调用
After-returning:在方法正常结束后调用
After-throwing:在方法出现异常时调用
After:类似于finnally,无论程序是否出现异常,都会执行
Around:环绕通知,可以以低侵入式的方式对指定方法进行拦截,并对参数进行校验
4.Aop的优点:
(1)可以采用低侵入式的方式,给原来的方法添加功能
(2)复用性很强,一个地方修改全局生效
(3)添加的功能和原来的方法之间实现松耦合
5.Aop原理:代理模式
添加命名空间
注解实现AOP
@Aspect
@Before
@After
在配置文件中配置(注意别忘了加上边的命名空间)