Spring基础用法
Spring
IOC
bean中id和name属性
//第一种用法(想当于css中的class选择器以空格为分)
<bean name="helloWorld a b c" class='com.test.Hello'>
<property name="username" value="Will"/>
</bean>
//从spring3,1开始,id属性不再是ID类型,而是String类型,可以使用"/"开头,而bean元素的唯一性也由容器负责检查
//第二种用法
<bean name="helloWorld,a,b,c" class='com.test.Hello'>
<property name="username" value="Will"/>
</bean>
//第三种用法(推荐使用,尽量比较规范,起那么多名字没有太大意义)
<bean id="helloWorld" class='com.test.Hello'>
<property name="username" value="Will"/>
</bean>
import resource 元素
在开发中随着应用规模的增大,applicationContext.xml的配置文件变得非常的臃肿,为了提高可读性,我们可以将applicationContext.xml拆分成多个配置文件
<import resource="classpath:com/text/hello/hello.xml"/>
- 默认情况下从classpath的根路径寻找
- 可以使用前缀来定位文件基础的位置
- classpath:后面的文件从classpath路径开始找
- file:后面的文件从文件系统路径开始找
- 注意: 只有框架实现了Resource接口才可以识别以上前缀的标识符
Spring测试框架
现在测试案例包含Spring容器
- 每一次测试都需要创建新的Spring容器,测试完毕销毁Spring,容器性能开销吃不消
- 非正常的方式关闭Spring容器的
//单元测试Junit5的方式
@SpringJUnitConfig
public class SpringTest{
@Autowired
private SomeBean bean
//单元测试Junit5不需要范围修饰符
@Test
void testname() throws Exception{
bean.toString();
}
}
bean的创建时机
- BeanFactory是创建一个bean的时候才会创建该bean -- 延迟初始化
- ApplicationContext在启动Spring容器的时候就会创建所有bean(web应用推荐使用)
ApplicationContext继承了BeanFactory的,除此之外还提供了AOP集成,国际化处理,事件传播,统一资源价值等功能
@Test
public TestApplicationContext() throw Exception{
ApplicationContext ctx=new ClasspathXmlApplicationContext("xml路径");
Person p=ctx。getBean("Person",Person.class);
System.out.println(p);
}
@Autowired && @Qualifier(“other”)
- 自动把符合要求的对象找出来,然后注入到对象
- 可以贴在字段或者setter上面
- 可以同时注入多个对象
@Autowired
public void setter(Bean bean1,Bean bean2){
}
- 可以注入一些Spring内置的重要对象,比如BeanFactory,ApplicationContext,ServletContext等;
- 默认情况下Autowired注解必须要能找到对应的对象,否则报错。
通过required=false来避免这个问题:Autowired(required=false)
- 第三方程序:Spring 3.0之前,需要手动配置@Autowired注解的解析程序:
//DI注解解析器
<context:annotation-config/>
- Autowired注解寻找bean的方式:
- 首先按照依赖对象的类型找,如果找到,就是用setter或者字段直接注入;
- 如果在Spring上下文中找到多个匹配的类型,再按照名字去找,如果没有匹配报错;
- 可以通过使用@Qualifier("other")标签来规定依赖对象按照bean的id和类型的组合去找;
Scope和PostConstruct以及PreDestroy注解
- xml写法
<bean id="SomeBean" class="com.test.SomeBean" scope="singleton"
init-method="open" destroy-method="close"/>
//scope是调整SpringIOC容器切换单例模式和多例模式的注入
//init-method是初始化方法
//destroy-method是摧毁前扫尾方法
- 注解写法
@Component
@Scope("protptype")
public class SomeBean{
public SomeBean(){
System.out.println("构建SomeBean对象");
}
@PostConstruct //构建的对象之后
public void open(){
System.out.println("初始化方法");
}
@PreDestroy //销毁之前
public void close(){
System.out.println("摧毁前扫尾方法");
}
public void doWork(){
System.out.println("工作");
}
}
IOC注解
bean组件版型 : 四个组件的功能是相同的,只是用于标注不同类型的组件
- @Component 泛指组件,当组件不好归类的时候,使用此注解
- @Repository 用于标注数据访问组件,即DAO组件
- @Service 用于标注业务层组件
- @Controller 用于标注控制层组件(SpringMVC的Controller)
AOP
过滤器和拦截器
Filter就是对请求和相应做拦截
Filter: web领域的概念,只能针对于请求和响应增强,离不开servlet-api.jar
Interceptor:整个java领域的概念,不仅可以运用到service层,还可以用到web层
行内术语
Joinpoint:连接点,被拦截到需要被增强的方法。where:去哪里做增强
Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。where:去哪些地方做增强
Advice:增强,当拦截到Joinpoint之后,在方法执行的什么时机(when)做什么样(what)的增强。
Aspect:切面,Pointcut+Advice,去哪些地方+在什么时候+做什么增强
Target:目标对象,被代理的目标对象
Weaving:织入,把Advice加到Target上之后,创建出Proxy对象的过程