Spring 的 bean 注入方式小结(生成bean方式)

目录

1、目的:

2、简单方式

3、复杂方式

3.1@Import 方式

3.2@Import 结合 ImportSelector 接口

3.3@import结合ImportBeanDefinitionRegistrar接口

3.4@importResource 结合配置文件  classpath:spring-jdbc-zx-lsq.xml


1、目的:


阅读本文之后对于springboot中导入bean所有方式有一个整体的理解

2、简单方式


@bean @Component@Controller@Service等

@Configuration
public class ConfigurationTest {
    @Bean
    public ValueTest getValueTest() {
        return new ValueTest();
    }
}

下图显示了什么时候被@bean注解标记的方法会被处理,完整的图片地址在文末。

3、复杂方式

3.1@Import 方式

package com.defire.other;

public class ImportTest {
    public String  primm(){
        System.out.println(11111);
        return "primm";
    }
}
package com.defire.other;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({ImportTest.class})
public class ImportConfigurationTest {

}

只需要使用@Import({ImportTest.class})即可轻松引入各种bean。springboot这种情况使用

下图显示了在整个spring体现中@import注解什么时候生效,完整的图片地址在文末。

3.2@Import 结合 ImportSelector 接口


public class ImportSeletorTest implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        String[] arr =  new String[1];
        arr[0]="com.yeahka.demo.other.ValueTest";
        return arr;
    }

}
@Configuration
@Import({ImportSeletorTest.class})
public class ConfigurationTest {

}

3.3@import结合ImportBeanDefinitionRegistrar接口

package com.yeahka.demo.otherBean;
public class HelloService {
    public String test(){
        return toString();
    }
}

@RestController
public class TestController {

    @Autowired
    ImportAnnotationTest importAnnotationTest;

    @Autowired
    HelloService helloService;

    @GetMapping("/test")
    public String test(){
        return helloService.toString();
    }
}


@Configuration
@ComponentScan("com.yeahka.demo.otherBean")
@Import({ImportSeletorTest.class,HelloImportBeanDefinitionRegistrar.class})
public class ConfigurationTest {

}

public class HelloImportBeanDefinitionRegistrar
          implements ImportBeanDefinitionRegistrar {

      /**
       * AnnotationMetadata:引入当前类的类注解信息;
       * BeanDefinitionRegistry:注册器,其registerBeanDefinition()可以注册bean
       **/
      @Override
      public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                          BeanDefinitionRegistry registry) {
  
          //扫描注解
          Map<String, Object> annotationAttributes = importingClassMetadata
              .getAnnotationAttributes(ComponentScan.class.getName());
          String[] basePackages = (String[]) annotationAttributes.get("basePackages");
  
          //扫描类
          ClassPathBeanDefinitionScanner scanner =
                  new ClassPathBeanDefinitionScanner(registry, false);
          TypeFilter helloServiceFilter = new AssignableTypeFilter(HelloService.class);
          
          scanner.addIncludeFilter(helloServiceFilter);
          scanner.scan(basePackages);
      }
  
  }

3.3的例子演示了用户自己定义,没有使用任何注解的类HelloService通过实现 ImportBeanDefinitionRegistrar方式扫描进入容器。

下图显示了框架什么时候处理实现了ImportBeanDefinitionRegistrar的这些子类。

3.4@importResource 结合配置文件  classpath:spring-jdbc-zx-lsq.xml

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class},scanBasePackages = {"com.yeahka.demo.**"})
@ImportResource(locations = {
        "classpath:spring-jdbc-zx-lsq.xml"
})

public class DemoApplication {

    @Autowired
    ValueTest valueTest;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                        http://www.dangdang.com/schema/ddframe/rdb
                        http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd
    ">

    <context:property-placeholder ignore-unresolvable="true"/>

    <bean id="db-zx-lsq-master" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="true" >
        <property name="driverClassName" value="${db.driver-class-name}"/>
        <property name="url" value="${db.zx_platform_lsq_master.url}"/>
        <property name="username" value="${db.zx_platform_lsq_master.username}"/>
        <property name="password" value="${db.zx_platform_lsq_master.password}"/>

        <property name="initialSize" value="5"/>
        <property name="minIdle" value="5"/>
        <property name="maxActive" value="30"/>

        <property name="maxWait" value="60000"/>
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <!-- 用来检测连接是否有效的sql -->
        <property name="validationQuery" value="SELECT 'x'"/>
        <!-- 空间时执行 validationQuery -->
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <!-- 别名的方式配置扩展插件. stat:监控统计 -->
        <property name="filters" value="stat"/>
    </bean>

    <bean id="db-zx-lsq-slave" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${db.driver-class-name}"/>
        <property name="url" value="${db.zx_platform_lsq_slave.url}"/>
        <property name="username" value="${db.zx_platform_lsq_slave.username}"/>
        <property name="password" value="${db.zx_platform_lsq_slave.password}"/>

        <property name="initialSize" value="5"/>
        <property name="minIdle" value="5"/>
        <property name="maxActive" value="30"/>

        <property name="maxWait" value="60000"/>
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <property name="validationQuery" value="SELECT 'x'"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <property name="filters" value="stat"/>
    </bean>





    <!-- myBatis文件 -->
    <bean id="sqlSessionFactory-zx-lsq" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="db-zx-lsq-master"/>
        <property name="mapperLocations" value="classpath:mapper/platform_lsq/*.xml"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    </bean>


    <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.yeahka.demo.dao"/>
        <!--<property name="annotationClass" value="com.yeahka.online.provider.common.config.annotation.PlatformLsqDao"/>-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory-zx-lsq"/>
    </bean>

    <!-- 事务 -->
    <bean id="transactionManager-zx-lsq" name="transactionManager-zx-lsq" primary="false" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="db-zx-lsq-master"/>
        <qualifier value="lsq"/>
    </bean>

    <!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务  -->
    <tx:annotation-driven transaction-manager="transactionManager-zx-lsq" proxy-target-class="true"/>
</beans>

下图显示了什么时候处理这个类型

图片完整地址
https://www.processon.com/view/link/5e847d98e4b07b16dcdb8a46

猜你喜欢

转载自blog.csdn.net/ygy982883422/article/details/105583701