Spring(二) Spring装配Bean的几种方式
2020-04-10 16:03:52来源:博客园 阅读 ()
Spring(二) Spring装配Bean的几种方式
Spring中,Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系。前提是我们要告诉Spring,需要创建哪些bean(bean的申明),这些bean的装配规则是什么(bean的装配)。Spring提供了3种主要的bean发现-注册-装配机制,分别为:
- XML文件显式配置
- Java配置类显式配置
- 自动扫描及自动装配
结构图如下:
1. bean的申明
XML文件显式申明
在xml文件的<beans/>
标签下的<bean>
标签中申明需要Spring管理的bean。
Java代码显示申明
使用@Configuration
标注配置类,@Bean
标注bean产生的方法。
@Configuration
标注一个类为配置类。配置类的方法上标注@Bean
注解,@Bean
注解会告诉Spring这个方法会
返回一个对象,改对象要注册为Spring应用上下文的Bean。该方法中包含了Bean产生的逻辑。
配置组件自动扫描
需要Spring管理的bean上标注@Component
注解,并启用Spring的组件自动扫描。
组件扫描启用后会扫描类上标注了@Component
注解的Bean。@Component
注解表明该类会作为组件类,并
告知Spring要为这个类创建Bean。
启用组件自动扫描的2种方式:
- XML配置。
<context:component-scan/>
- Java配置。
@ComponentScan
+@Configuration
组件扫描的命名
默认是将类名的第一个字母变成小写作为组件的ID,也可以通过@Component注解指定ID
2. bean的装配
XML文件中装配
构造器注入初始化bean:<constructor-arg>
属性装配:<property>
Java配置类中装配
在@Configuration
标注的配置类中,@Bean
注解标注的方法,会有和@Autowired
标注在方法上一样的效果,会自动注入。
自动装配
使用@Autowired
或者@Resource
注解
-
属性注入
-
构造器注入
-
方法注入
3. 场景分析
XML文件申明及装配
申明第三方bean,并装配属性,如配置数据源:
<!-- 配置Druid数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 指定连接池中最大的活跃连接数 -->
<property name="maxActive" value="20"/>
<!-- 指定启动连接池时,初始建立的连接数量 -->
<property name="initialSize" value="1"/>
<!-- 指定连接池等待连接返回的最大等待时间,毫秒单位. -->
<property name="maxWait" value="60000"/>
<!-- 指定必须保持连接的最小值(For DBCP and Tomcat connection pools) -->
<property name="minIdle" value="1"/>
</bean>
申明第三方bean,装配自定义类,自定义类需要先在XML中申明,然后通过属性或构造器注入。如配置Shiro自定义Relam:
<!-- 注册Shiro Relam -->
<bean id="userRelam" class="com.lyldelove.base.shiro.UserRealm"></bean>
<!-- 配置Shiro SecurityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRelam"/>
</bean>
UserRealm.java不需要标注任何注解
Java配置类配置
使用@Configuration
标注类为配置类,使用@Bean
申明对象,@Bean
标注的方法在一个配置类中,是会自动注入的,同样是配置Shiro自定义Relam:
@Configuration
public class ShiroConfig
{
/**
* 自定义Realm
*/
@Bean
public UserRealm userRealm()
{
UserRealm userRealm = new UserRealm();
return userRealm;
}
/**
* 安全管理器
*/
//标注@Bean,会自动注入上面定义的UserRealm
@Bean
public SecurityManager securityManager(UserRealm userRealm)
{
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm.
securityManager.setRealm(userRealm);
return securityManager;
}
}
UserRealm.java不需要标注任何注解
组件扫描和自动装配
一般使用组件扫描的,都是不需要再配置的,如@Controller、@Service等,直接使用就可以的。这种类型只需要在类上标注@Component,在使用的地方@Autowired引入即可。
4. 小思考
-
可以简单这么理解:
@Configuration
注解相当于一个xml配置文件,相当于一个<beans>
,@Bean
注解相当于<bean/>
-
XML配置中,
<bean/>
调用的是申明对象的默认/指定构造器来创建Bean的,而Java配置类中,@Bean
标注的方法可以自定义写对象生成的逻辑,更加灵活。当然我们可以编写Java类,在类中写bean的逻辑,不使用@Configuration
申明而是直接通过XML的方式进行申明,都是可以的。有的时候,使用配置类申明对象会简单很多,比如:申明多线程ScheduledExecutorService
:Java配置类申明:
@Configuration public class ThreadPoolConfig { // 核心线程池大小 private int corePoolSize = 50; /** * 执行周期性或定时任务 */ @Bean(name = "scheduledExecutorService") protected ScheduledExecutorService scheduledExecutorService() { return new ScheduledThreadPoolExecutor(corePoolSize, new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); Threads.printException(r, t); } }; } }
这种情况,使用XML进行申明就会很麻烦:
- 需要申明ScheduledThreadPoolExecutor
- 需要申明BasicThreadFactory
- 需要申明Builder
- 然后将上面3个组件组装起来
-
个人建议:如果项目使用的是XML文件管理bean,就尽量都用XML申明;用
@Configuration
管理的,就尽量都用@Configuration
,且配置类放到一起。当然Java配置类是趋势,且更好管理。
原文链接:https://www.cnblogs.com/lyldelove/p/12670982.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:java System类
下一篇:java Calendar类
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash