Spring基础知识点复习

CY 2018年02月02日 53次浏览

ApplicationContext的三个非常有用的子类

BeanFactorySpring容器的顶层接口,ApplicationContext是它的子接口,它两个的区别:

  • ApplicationContext 读取配置文件就创建了对象

  • BeanFactory 使用到对象的时候才创建对象

ClassPathXmlApplicationContext:从ClassPath下加载配置文件

FileSystemXmlApplicationContext:从文件系统中加载配置文件

AnnotationConfigApplicationContext:使用注解的时候使用该类,他会读取Spring的注解

bean标签中的属性

  • id:对象的唯一标识

  • class:类的全限定名

  • scope:对象的作用范围

    • singleton:默认,单例
    • prototype:多例
    • request:request域
    • session:session域
    • global session:如果没有Portlet环境相当于session
  • init-method:该Bean被初始化的时候执行的方法的名称

  • destroy-method:该Bean被销毁的时候执行的方法的名称

在单例的时候对象从加载到消亡全部都是Spring容器决定的,在多例的时候,对象的死亡和容器销毁是没有关系的,Bean的销毁只和JVM的垃圾回收有关。

实例化Bean的三种方式

方式一:使用构造方法来实例化,但是如果没有无参的构造,将会实例化失败

方式二:使用静态工厂来实例化对象,这个时候需要配置bean标签中的idclassfactory-method

  • class:指定静态工厂的类名
  • factory-method:指定静态工厂中的方法名

方式二:使用实例工厂来实例化对象,这个时候需要配置bean标签中的idfactory-beanfactory-method

依赖注入的方式

通过构造函数注入,这个时候需要给bean写一个子标签,constructor-arg,属性解释:

  • index:参数的位置

  • type:参数的类型

  • name:参数的名字

  • value:参数的值

  • ref:如果是复杂类型可以使用ref进行引用

通过set方法注入,需要一个property子标签,属性如下:

  • name:属性的名字
  • ref:属性引用的类型
  • value:属性的值

使用p名称空间注入,需要在约束里面引入p名称空间

<beans ...
       xmlns:p="http://www.springframework.org/schema/p"
       ...>
    ...
</beans>

使用的时候只需要p:属性名就可以了,涉及到复杂的类型p:属性名-ref

注入集合属性

数组、list、set,使用子标签arraylistset,这些标签的子标签是标签valuevalue标签中写上值就可以了

properties、map,使用标签props或者map,其中props标签和prop搭配使用,mapentry标签配合使用

例如:

<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
<!-- 给数组注入数据 -->
<property name="...">
    <set>
        <value>...</value>
        ...
    </set>
</property>
<!-- 注入 list 集合数据 -->
<property name="...">
    <array>
        <value>...</value>
        ...
    </array>
</property>
<!-- 注入 set 集合数据 -->
<property name="...">
    <list>
        <value>...</value>
        ...
    </list>
</property>
<!-- 注入 Map 数据 -->
<property name="...">
    <props>
        <prop key="...">...</prop>
        ...
    </props>
</property>
<!-- 注入 properties 数据 -->
<property name="...">
    <map>
        <entry key="..." value="..."></entry>
        <entry key="...">
        	<value>...</value>
        </entry>
    </map>
</property>

基于注解的Spring

使用注解前需要在配置文件中添加一行

<context:component-scan base-package="..."></context:component-scan>

用来创建对象的注解

@Component注解,其中有一个value值,可以规定Bean的名称

类似的注解还有@Controller,@Service,@Repository,这些注解都是用来将类实例化,然后放入容器中

用来注入数据的注解

如果使用注解来注入数据,那么set方法可以不写

@Autowired,不可以注入自己,首先根据类型匹配,如果匹配到了,就注入,如果匹配到多个类型,就会依照变量名到容器中找,找到了就注入,找不到就报错

@Qualifier,他和@Autowired一起使用,除非是参数注入它才可以单独存在,它可以指定要注入的bean名称

@Resource,相当于上面两个注解的结合体

@Value,用来注入String或者基本数据类型

用来改变作用域的注解

@Scope,用来指定Bean的作用域,作用域上面有介绍。

和声明周期相关的注解

@PostConstruct:同init-method

@PreDestory:同destroy-method

纯注解Spring

配置类

@Configuration 标注该类是配置类

@ComponentScan("包名") 用来扫描包

@Bean 用来将方法的返回值作为Bean

@PropertySource 可以将*.properties文件中的的数据读取出来通过@Value注解注入给属性

@Import注解,如果项目中有好多的配置类,但是配置类上面不想写@Configuration,这个时候可以使用@Import注解来导入另一个配置类

补充,在主配置类中使用@ComponentScan(basePackages = "xxx") 将其他配置类扫描进来,这个时候其他配置类需要使用@Configuration注解,如果主配置类中使用@Import注解将其他配置类引入,其他配置类就可以不用使用@Configuration注解了。

所有在AnnotationConfigApplicationContext的参数中规定的类都可以不写@Configuration

结合Junit来测试Spring

测试类上加入@RunWith(SpringJUnit4ClassRunner.class)

还需要加入@ContextConfiguration(locations= {"classpath:bean.xml"})

其中@ContextConfiguration注解中有两个属性locationsclasses属性

locations:指定配置文件的位置

classes:如果不使用XML配置,使用此属性可以指定注解类的位置