Spring基础用法

367

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"/>
  1. 默认情况下从classpath的根路径寻找
  2. 可以使用前缀来定位文件基础的位置
    • classpath:后面的文件从classpath路径开始找
    • file:后面的文件从文件系统路径开始找
    • 注意: 只有框架实现了Resource接口才可以识别以上前缀的标识符
Spring测试框架

现在测试案例包含Spring容器

  1. 每一次测试都需要创建新的Spring容器,测试完毕销毁Spring,容器性能开销吃不消
  2. 非正常的方式关闭Spring容器的
//单元测试Junit5的方式
@SpringJUnitConfig
public class SpringTest{
    
@Autowired
private SomeBean bean

//单元测试Junit5不需要范围修饰符
@Test
void testname() throws Exception{
       bean.toString();
	}
}
bean的创建时机
  1. BeanFactory是创建一个bean的时候才会创建该bean -- 延迟初始化
  2. 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”)
  1. 自动把符合要求的对象找出来,然后注入到对象
  2. 可以贴在字段或者setter上面
  3. 可以同时注入多个对象
@Autowired
public void setter(Bean bean1,Bean bean2){
    
}
  1. 可以注入一些Spring内置的重要对象,比如BeanFactory,ApplicationContext,ServletContext等;
  2. 默认情况下Autowired注解必须要能找到对应的对象,否则报错。

通过required=false来避免这个问题:Autowired(required=false)

  1. 第三方程序:Spring 3.0之前,需要手动配置@Autowired注解的解析程序:
//DI注解解析器
<context:annotation-config/>
  1. 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对象的过程