Spring IoC 有依赖查找和依赖注入, 之前不太明白依赖查找是什么意思, 翻了一大堆博客看了好多定义也不太清楚 , 后来看了小马哥视频, 他通过代码演示, 清楚地讲解了什么是 依赖查找以及几种依赖查找的方法, 本文结合代码浅析一下 Spring IoC 的依赖查找, 通过代码来更加形象的理解依赖查找.
1. 根据 bean 名称查找:
实时查找
延时查找
1. 配置 xml 文件
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- ">
- <!-- 实时查找 -->
- <bean id="User" class="thinking.in.spring.ioc.overview.domain.User">
- <property name="id" value="1"/>
- <property name="name" value="小明"/>
- </bean>
- <!-- 延时查找 -->
- <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
- <property name="targetBeanName" value="User"/>
- </bean>
- </beans>
2. 启动 spring 应用上下文
- public class DenpendencyLookupDemo {
- public static void main(String[] args) {
- BeanFactory beanFactory=new ClassPathXmlApplicationContext("META-INF/dependency-Lookup-context.xml");
- // 时实查找
- User user=(User) beanFactory.getBean("User");
- System.out.println("实时查找"+user.toString());
- // 延时查找
- ObjectFactory<User> objectFactory= (ObjectFactory<User>)beanFactory.getBean("objectFactory");
- User user1=objectFactory.getObject();
- System.out.println("延时查找"+user1.toString());
- }
- }
输出:
2. 通过类型查找
单个 Bean 对象
集合 Bean 对象
- /**
- * 根据类型查找单个 bean
- * @param beanFactory
- */
- private static void lookupSingleByType(BeanFactory beanFactory){
- User user2 = beanFactory.getBean(User.class);
- System.out.println("根据类型时实查找单一" + user2.toString());
- }
- /**
- * 查找多个 bean
- */
- private static void lookupCollectionBtType (BeanFactory beanFactory){
- if (beanFactory instanceof ListableBeanFactory) {
- ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
- Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
- System.out.println("查找多个 bean" + users);
- }
- }
输出:
3. 通过注解查找
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- ">
- <!-- 实时查找 -->
- <bean id="User" class="thinking.in.spring.ioc.overview.domain.User">
- <property name="id" value="1"/>
- <property name="name" value="小明"/>
- </bean>
- <!-- 延时查找 -->
- <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
- <property name="targetBeanName" value="User"/>
- </bean>
- <bean id="superUser" class="thinking.in.spring.ioc.overview.domain.SuperUser" parent="User" primary="true">
- <property name="number" value="1"/>
- </bean>
- </beans>
@Super 注解
1 @Target({ElementType.TYPE})2 @Retention(RetentionPolicy.RUNTIME)3 public @interfaceSuper {4 }
SuperUser 类
- @Super
- public class SuperUser extends User{
- private String number;
- public String getNumber() {
- return number;
- }
- public void setNumber(String number) {
- this.number = number;
- }
- @Override
- public String toString() {
- return "SuperUser{" +
- "number='" + number + '\'' +
- "}" + super.toString();
- }
- }
用法
- 1 /**
- 2 * 通过注解查找
- 3 * @param beanFactory
- 4 */
- 5 private static void lookupByAnnotatonType(BeanFactory beanFactory){
- 6 if(beanFactory instanceof ListableBeanFactory){
- 7 ListableBeanFactory listableBeanFactory=(ListableBeanFactory)beanFactory;
- // 根据注解查找
- 8 Map<String,User> users=( Map)listableBeanFactory.getBeansWithAnnotation(Super.class);
- 9 System.out.println("查找标注 @Super 所有的 User 集合对象"+users);
- 10 }
- 11 }
输出:
只查找出标注了 @Super 注解且是 User 类型的 Bean
来源: https://www.cnblogs.com/Sherlockmmc/p/12494747.html