Spring知识点总结

1. BeanFactory与AppicationContent区别?

BeanFactory是Spring框架中IOC容器的顶层接口,定义了一些基本的功能接口及规范(基础容器);而AppicationContent(容器的高级接口)是BeanFactory的一个子接口,AppicationContent具备BeanFactory的全部功能,且较之有更丰富的功能,比如国际化功能,资源访问(XML,java配置类)等

2.spring中xml方式实例化对象的三种方式

A.通过 对象的无参构造创建对象

B. 静态⽅法创建对象

eg:  在BeanFactory中定义静态方法如getStaticInstance(),返回   new ConnectionUtils() 对象

<bean id="connectionUtils" class="com.kay.factory.BeanFactory" factory-method="getStaticInstance"></bean>
public class BeanFactory {
    public static ConnectionUtils getStaticInstance(){
        return new ConnectionUtils();
    }

}

C.使⽤实例⽅法创建对象

eg: 通过 BeanFactory 的实例方法创建 ConnectionUtils 对象

<bean id="beanFactory" class="com.kay.factory.BeanFactory"></bean>
<bean factory-bean="beanFactory" factory-method="getInstance" id="connectionUtils"></bean>
public class BeanFactory {
    public ConnectionUtils getInstance(){
        return new ConnectionUtils();
    }
}

3.spring中Bean的作用域及⽣命周期

默认是单例的(scope="singleton" ),容器启动时创建,容器销毁时销毁(与容器的生命周期一致)

多例:scope="prototype" 使用对象的时候创建,当对象长时间不使用,由JVM垃圾回收器回收 (当作用范围设置为多例时,spring框架只负责创建,不负责销毁)

4.spring中<bean>标签下属性

id:bean的唯一标识;

class: 要创建的bean的全限定类名

scope: 指定对象的作用范围

factory-method:  用户创建当前对象的工厂对应的方法名(见2)

与class一起使用,则方法为static修饰的静态方法;

与factory-bean一起使用时,class属性失效;

factory-bean:  用户创建当前对象的工厂对应的ID(见2) 配置此属性后,class属性失效

init-method:指定对象的初始化方法

destroy-method: 指定对象的销毁方法

lazy-init: 延迟加载,默认为fasle,即立即加载,在容器启动时,立即实例化;

        当lazy-init设置为true时,将不会在ApplicationContext启动时被提前实例化,而是在第一次通过getBean向容器索取时被实例化;

        A.如果一个立即加载的bean1引用了延迟加载的bean2,那么bean1在容器启动时被实例化,由于bean2被bean1引用,所以bean2也会被实例化;这种情况也符合bean在被第一次getBean时实例化的规则;

        B.如果配置了scope="pototype",时即使设置了lazy-init=“false”,在容器初始化的时候也不会被实例化,而是在getBean时才会被实例化

        C.对于不长使用的bean可以设置延迟加载

5. XMl方式依赖注入

A.构造函数注入

必须有构造函数,且类中提供的构造函数参数个数必须和配置的参数个数⼀致,且数据类型匹配

xml中<constructor-arg> 标签 name:指定的属性名,value属性值 ref:指定其他类型,为其他类型的bean唯一标识ID; index:用于指定构造函数中对应索引位置对象赋值(0开始)

B.Set注入

需要有Set方法配置

XML中使用<property>标签, name:set+name = set方法的方法名;value:要注入的值;ref:指定的其他类型对应的bean标识Id;

6.spring中常用注解对应的XML中标签或属性关系

IOC
@Component("自定义命名,不写则默认为首字母小写,后同")/@Controller、@Service、@Repository分别⽤于控制层类、服务层类、dao层类 bean
@Scope("prototype")(类上,默认是单例singleton)   scope  
@PostConstruct(方法上)   init-method 指定对象初始化的方法
@PreDestory(方法上)    destory-method  指定对象的销毁方法

DI注入:
@Autowired 为Spring提供的注解,按照类型注入 当存在一个接口有多个实现类,无法唯一确定时+ @Qualifier(name="指定对应的名称") 配合使用
@Autowired
@Qualifier(name="xxx") 

@Resource 由J2EE提供,需要导包javax.annotation.Resource
name 指定名称(根据bean的Id查找)
type 指定类型(根据类型查找)
根据两者配置确定查询条件为单一条件或者组合条件;找不到或者找到多条,均返回异常
都没有配置 默认按照name查询(即ID)

@Configuration 注解,表名当前类是⼀个配置类
@ComponentScan 注解,替代 context:component-scan 
@PropertySource,引入外部属性配置文件 @PropertySource("classpath:jdbc.properties")
@Import 引入其他配置类
@Value 对变量赋值,可以直接赋值,也可以使用${} 读取资源配置文件中的信息
@Bean 将方法返回的对象加入到SpringIOC中(配合Configuration使用)

7.FactoryBean作用及用法

FactoryBean是工厂bean,可以用来创建某一类型的bean实例(常用于创建复杂的bean对象) 2中创建对象的三种方式中后两种与FactoryBean的作用相识

在FactoryBean中定义了三个接口

public interface FactoryBean<T> {
 @Nullable
 // 返回FactoryBean创建的Bean实例,如果isSingleton返回true,则该实例会放到Spring容器
 // 的单例对象缓存池中Map
 T getObject() throws Exception;
 @Nullable
 // 返回FactoryBean创建的Bean类型
 Class<?> getObjectType();
 // 返回作⽤域是否单例
 default boolean isSingleton() {
 return true;
 } }

使用方法

1. 要创建的对象Company ,用自定义个的MyFactoryBean实现FactoryBean<A> 并实现其中的方法,在getObject中实现生成Company的逻辑

public class MyFactoryBean implements FactoryBean<Company> {
    @Override
    public Company getObject() throws Exception {
        // getObject 中编写 对象 的生成逻辑
        return new Company("name is kay", "address is aaaa", 111);
    }

    @Override
    public Class<?> getObjectType() {
        return Company.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

2. xml中配置

    <bean id="myFactoryBean" class="com.kay.factoryBean.MyFactoryBean"></bean>

3.获取Company对象通过使用MyFactoryBean对应的ID从IOC中得到:

 applicationContext.getBean("myFactoryBean");

而想要获取MyFactoryBean对象则需要 在id myFactoryBean 前面加上& 可以在BeanFactory接口类中查看为什么是& (在BeanFactory源码中,定义了 String FACTORY_BEAN_PREFIX = "&";)

applicationContext.getBean("&myFactoryBean")

8. BeanFactoryPostProcessor 

BeanFactory级别的后置处理器,是针对整个Bean工厂的处理,作用在BeanFactory创建后,已经读取了xml中配置信息并将<bean>标签中信息封装到了BeanDefinition之后,在实例化Bean之前;

自定义BeanFactoryPostProcessor需要实现 BeanFactoryPostProcessor接口及对应的postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法 beanFactory 中可通过getBeanDefinition(String beanName)获取对应的BeanDefinition对象

例如: PropertyPlaceholderConfigurer

其父类PropertyResourceConfigurer实现了BeanFactoryPostProcessor接口,Spring框架,在将<bean>标签封装到BeanDefinication后,会进入PropertyResourceConfigurer的postProcessBeanFactory方法,将解析<propery>中的占位符并拿到对应的值,重复赋值到BeanDefinication中(例如${jdbc.driver} 将被替换成实际的值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值