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的上下文;
个人根据使用情况和分析整理总结,可能存在遗漏,欢迎拍砖留言讨论...