1.xml文件方式定义

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="beanName" class="com.tj.classpath" />
  6. </beans>

通过ClassPathXmlApplicationContext获取bean

  1. public static void main(String[] args) {
  2. //初始化上下文对象
  3. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. //获取bean
  5. Object beanName = ctx.getBean("beanName");
  6. }

2.通过注解定义,bean名称可以省略

@Component(“beanName”)

@Service(“beanName”)

@Configuration(“beanName”)

参考:@Configuration详解

@Controller

@Repository

通过xml文件指定bean加载位置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. ">
  11. <!--指定加载bean的位置,component-->
  12. <context:component-scan base-package="com.tj.domain"/>
  13. </beans>

@Bean可以定义第三方bean

  1. @Configuration
  2. public class MysqlConfig {
  3. @Value("${mysql.username}")
  4. private String username;
  5. @Value("${mysql.password}")
  6. private String password;
  7. @Value("${mysql.url}")
  8. private String url;
  9. @Bean
  10. public DataSource dataSource() {
  11. DruidDataSource dataSource = new DruidDataSource();
  12. //dataSource.setDriverClassName(driverClassName);//如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
  13. dataSource.setUrl(url);
  14. dataSource.setUsername(username);
  15. dataSource.setPassword(password);
  16. dataSource.setValidationQuery("SELECT 1");//用来检测连接是否有效
  17. dataSource.setTestOnBorrow(false);//借用连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
  18. dataSource.setTestOnReturn(false);//归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
  19. //连接空闲时检测,如果连接空闲时间大于timeBetweenEvictionRunsMillis指定的毫秒,执行validationQuery指定的SQL来检测连接是否有效
  20. dataSource.setTestWhileIdle(true);//如果检测失败,则连接将被从池中去除
  21. dataSource.setTimeBetweenEvictionRunsMillis(60000);//1分钟
  22. dataSource.setMaxActive(20);
  23. dataSource.setInitialSize(5);
  24. return dataSource;
  25. }
  26. }

3.可以通过@ComponentScan指定bean的扫描位置

这个可以代替在xml中的位置指定
@ComponentScan本身也会变成bean

  1. @ComponentScan({"com.tj.domain","com.tj.config"})

4.FactoryBean

5.@ImportResource加载配置类并加载配置文件(系统迁移)

可以让配置类导入原始的xml的bean配置

  1. @ImportResource("applicationContext.xml")

6.@Configuration(proxyBeanMethods = true)

proxyBeanMethods 默认就是true,可以保障调用此方法得到的对象是从容器中获取的而不是重新new的

7.@Import

使用@Import注解导入要注入的bean对应的字节码,此形式可以有效的降低源代码与spring技术的耦合度,在spring技术底层及诸多框架的整合中大量使用

  1. @Import({BeanTest.class,BeanTest2.class,})

8.AnnotationConfigApplicationContext.registerBean(“beanName”, BeanTest.class);

  1. //初始化上下文对象
  2. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);
  3. //上下文容器对象已经初始化完毕后,手工加载bean
  4. ctx.registerBean("beanName", BeanTest.class); //指定bean名称的
  5. ctx.register(BeanTest.class);//直接使用类目注册

9.ImportSelector

  1. package com.tj.domain;
  2. import org.springframework.context.annotation.ImportSelector;
  3. import org.springframework.core.type.AnnotationMetadata;
  4. public class MyImportSelector implements ImportSelector {
  5. @Override
  6. public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  7. return new String[]{"com.tj.domain.BeanTest"};
  8. }
  9. }

10.ImportBeanDefinitionRegistrar

BeanDefinition

11.BeanDefinitionRegistryPostProcessor

Bean的后处理器

12.@Conditional()注解控制bean的加载

springboot里可以通过@ConditionalOnxxxxx()来控制

13.@EnableConfigurationProperties

注解设定使用属性类时加载bean