Spring 容器负责创建应用程序中的 bean 并通过 DI 来协调这些对象之间的关系。但是,作为开发人员,你需要告诉 Spring 要创建哪些 bean 并且如何将其装配在一起。当描述 bean 如何进行装配时, Spring 具有非常大的灵活性,它提供了三种主要的装配机制:
- 在 XML 中进行显式配置。
- 在 Java 中进行显式配置。
- 隐式的 bean 发现机制和自动装配。
2.1 自动化装配bean
Spring 从两个角度来实现自动化装配:
- 组件扫描( component scanning ): Spring 会自动发现应用上下文中所创建的 bean 。
- 自动装配( autowiring ): Spring 自动满足 bean 之间的依赖。
给相应的类加上@Component注解
在实现类上加入@Component
注解,这个注解相当于一个标记,告诉spring需要创建这个类的实例并管理起来。
@Component public class UserImpl implements User{ }
在spring配置类中启用自动扫描@ComponentScan
@Configuration @ComponentScan public class Config{ }
::: tip 注意
如果没有其他配置的话, @ComponentScan 默认会扫描与配置类相同的包。Spring也会扫描这个包以及这个包下的所有子包,查找带有 @Component 注解的类。如果你更倾向于使用 XML 来启用组件扫描的话,那么可以使用 Spring context 命名空间的 <context:component-scan> 元素。
:::
我们可以手动的设置要扫描的包@ComponentScan(basePackages="包名")
,如果我们要扫描多个包@ComponentScan(basePackages={"包名",...,"包名"})
。当让以上方式是通过字符串形式,还有一种方式采用basePackageClasses进行配置,例如@ComponentScan(basePackageClasses=User.class)
、@ComponentScan(basePackageClasses={User.class})
,我个人比较喜欢第二种方式。
使用spring管理的bean,使用@Autowired注解
使用Autowired
注解,spring会把前面管理生成的实例,自动赋值到你声明的属性上。
@Service public class UserServiceImpl implements UserService{ @Autowired private User user; }
::: tip 注意
@Autowired 注解不仅能够用在构造器上,还能用在属性的 Setter 方法上。实际上, Setter 方法并没有什么特殊之处。 @Autowired 注解可以用在类的任何方法上。
:::
2.2 通过java代码装配bean
创建配置类
创建 JavaConfig 类的关键在于为其添加 @Configuration 注解, @Configuration 注解表明这个类是一个配置类,该类应该包含在 Spring 应用上下文中如何创建 bean 的细节。
@Configuration public class SpringConfig{ }
::: tip 注意
我们可以同时使用组件扫描和显式配置
:::
声明简单的Bean
@Bean
注解会告诉 Spring 这个方法将会返回一个对象,该对象要注册为 Spring 应用上下文中的 bean 。
@Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); }
::: tip 注意
默认情况下, bean 的 ID 与带有 @Bean 注解的方法名是一样的。在本例中, bean 的名字将会是 sgtPeppers 。如果你想为其设置成一个不同的名字的话,那么可以重命名该方法,也可以通过 name 属性指定一个不同的名字:@Bean(name="sgtPeppers")。如果一个接口有一个实例,则bean的id可能作用不是太明显,不重复即可,但是如果有多个实例,就需要手动指定注入的bean是哪个了。
:::
借助JavaConfig实现注入
@Bean public CDPlayer cdPlayer(){ return new CDPlayer(sgtPeppers()); }
::: tip 注意
看起来, CompactDisc 是通过调用 sgtPeppers() 得到的,但情况并非完全如此。因为 sgtPeppers() 方法上添加了 @Bean 注解, Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的 bean ,而不是每次都对其进行实际的调用。
:::
2.3 通过XML装配bean
这里介绍xml就采用相对简单的思路介绍了,建议xml如果要手动编辑的话,就直接上spring文章中复制吧,或者借助于sts之类的工具,这样确保不会出错是不。
声明bean
<bean class="soundsystem.SgtPeppers"/>
本来想写的,想了想还是看文档吧,这里就不整理了,只是稍微提一下思路。
2.4 导入和混合配置
在JavaConfig中引用XML配置
JavaConfig引用其它JavaConfig
@Configuration @Import(CDConfig.class) public class Config{}
JavaConfig引用xml配置文件
@Configuration @ImportResource("classpath:cd-config.xml") public class Config{}
在XML配置中引用JavaConfig
在XML中引用JavaConfig
<bean class="config.CDConfig"/>
在XML中引用XML
<import resource="cdplayer-config.xml"/>
原文地址:https://www.cnblogs.com/xzcode/p/9287248.html