Spring框架是如何初始化并注入Bean到容器中?

Spring框架对Bean的实例化并注入到Spring容器中,这个是框架的核心,简要记录一下,欢迎留言讨论... 正文如下:

主要有三种方式,

一,基于XML配置的注入,
这里就是过去我们常见的通过 application.xml 类配置各种bean,然后在web.xml中配置Spring监听器类ContextCleanupListener监听读取 application.xml 文件内容,解析XML中配置的各个Bean等标签,获取class,property等属性,利用Spring框架已经提供的各种工作类jar文件,进行初始化各种bean并注入Spring的IOC容器中;

<!-- 例如 application.xml 中数据源的Bean配置,事先引入 druid-1.1.2.jar -->
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="driverClassName"  value = "com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=DBName"/>
    <property name="username" value="dbUserName"/>
    <property name="password" value="userPassword"/>
    ...
</bean>
</beans>


二,基于注解或部分结合Java代码方式完成注入,
这种多见后来的SpringBoot中使用的各种注解,如 @Compnent,@Controller,@Service,@Repository等等注解;
其实各个注解类也是获得该类的包含命名空间的路径,然后跟XML方式的一样,利用Spring框架已经提供的各种工作类jar文件,进行初始化各种Bean并注入Spring的IOC容器中;

//列如:@service 注解
@Service
public class XxxServiceImpl implements XxxService {
    
    //... code ...
    
}


三,注解同时结合Java代码方式完成注入,
这种主要是见SpringBoot的 @Configuation 和 @Bean 配合使用,
@Configuation 可看做类似没有配置bean的空 application.xml 文件,@Bean 注解则实例化并注入到Spring容器中;

@Configuration  //注解
public class YyyConfig {

    @Bean      
    public JedisPoolConfig getRedisConfig() {  
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
        
        // 最大空闲数
        jedisPoolConfig.setMaxIdle(20);
        
        // 连接池的最大数据库连接数
        jedisPoolConfig.setMaxTotal(100);
        
        // 最大建立连接等待时间
        jedisPoolConfig.setMaxWaitMillis(3000);
        
        // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
        jedisPoolConfig.setMinEvictableIdleTimeMillis(1800000);
        
        // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
        jedisPoolConfig.setNumTestsPerEvictionRun(3);
        
        // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        jedisPoolConfig.setTimeBetweenEvictionRunsMillis(-1);
        
        // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
        jedisPoolConfig.setTestOnBorrow(true);
        
        // 在空闲时检查有效性, 默认false
        jedisPoolConfig.setTestWhileIdle(true);
        
        return jedisPoolConfig;  
    }    

}

总得来说,不管是通过配置XML来配置各种Bean,还是通过注解方式配置各种Bean,其实结果就是得到完整的类路径,例如:com.xx.yy.kk.XClassName ,以及该类相关的一些 property(实为对应Bean的类变量的初始化值) 然后利用Spring框架已经提供的各种工作类jar文件(这里是为什么引入Spring框架的原因),通过提供的一些 property 属性进行实例化各种Bean并注入Spring的IOC容器中,也即Spring的上下文;

个人根据使用情况和分析整理总结,可能存在遗漏,欢迎拍砖留言讨论...
 

猜你喜欢

转载自blog.csdn.net/shenzhenNBA/article/details/86541366
今日推荐