Bean的定义

bean的四种注解定义格式:Component, Controller, Service, Repository

名称:@Component 定义一个bean
类型:类注解
位置:类定义上方
作用:设置该类为spring管理的bean
范例

  1. @Component("userService")
  2. public class UserServiceImpl implements UserService {}

说明:@Component的衍生注解,功能类似@Component

  • @Controller(表现层)
  • @Service(业务层)
  • @Repository(数据层)

相关属性

  • value(默认):定义bean的访问id
    1. @Component(value="beanId")
    2. public class ClassName{}

Bean的作用域

bean相关属性注解格式:Scope, PostConstruct(方法上), PreDestroy(方法上)
名称:@Scope
类型:类注解
位置:类定义上方
作用:设置该类作为bean对应的scope属性
范例

  1. @Scope("singleton")
  2. // @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  3. public class ClassName{}

相关属性

  • value(默认):定义bean的作用域singleton、prototype,默认为singleton
    • singleton:单例模式,在整个Spring IoC容器中,使用 singleton 定义的 bean 只有一个实例
    • prototype:原型模式,每次通过容器的getbean方法获取 prototype 定义的 bean 时,都产生一个新的 bean 实例

只有在 Web 应用中使用Spring时,request、session、global-session 作用域才有效

  • request:对于每次 HTTP 请求,使用 request 定义的 bean 都将产生一个新实例,即每次 HTTP 请求将会产生不同的 bean 实例。
  • session:同一个 Session 共享一个 bean 实例。
  • global-session:同 session 作用域不同的是,所有的Session共享一个Bean实例。

Bean的生命周期

名称:@PostConstruct(初始化时执行)、@PreDestroy(销毁时执行)
类型:方法注解
位置:方法定义上方
作用:设置该类作为bean对应的生命周期方法
范例

  1. @PostConstruct
  2. public void init() { System.out.println("init..."); }
  3. @PreDestroy
  4. public void destroy() {}

加载第三方资源

名称:@Bean
类型:方法注解
位置:方法定义上方
作用:设置该方法的返回值作为spring管理的bean
范例

  1. @Component
  2. public class JDBCConfig {
  3. @Bean("dataSource")
  4. public DruidDataSource createDataSource() { return ……; }
  5. }

说明

  • 因为第三方bean无法在其源码上进行修改,使用@Bean解决第三方bean的引入问题
  • 该注解用于替代XML配置中的静态工厂与实例工厂创建bean,不区分方法是否为静态或非静态
  • @Bean所在的类必须被spring扫描加载,否则该注解无法生效

    1. @Component
    2. public class JDBCConfig {}

    相关属性

  • value(默认):定义bean的访问id

Bean属性注入

  1. 非引用类型注入
    • @Value
  2. 引用类型注入
    • @Autowired = @Inject
    • @Qualifier = @Named
    • @Primary
    • @Resource: name, type

非引用类型属性注入

名称:@Value
类型:属性注解、方法注解
位置:属性定义上方,set方法定义上方
作用:设置对应属性的值或对方法进行传参
范例

  1. @Value("zhangsan")
  2. private String username;

说明

  • value值仅支持非引用类型数据
  • value值支持SpEL:@Value(“#{‘zhangsan’}”)
  • @value注解如果添加在属性上方,可以省略set方法
  • value值支持读取properties或yml文件中的属性值,通过类属性将properties或yml中数据传入类中

    1. @Value("${address.host1}")
    2. @Value("${address.host1:127.0.0.1}")// 加冒号可设置默认值
    3. @Value("${address.host1:}") // 默认值为空字符串""
    4. private String host1;

    相关属性

  • value(默认):定义对应的属性值或参数值

引用类型属性注入

名称:@Autowired、@Qualifier
类型:属性注解、方法注解
位置:属性定义上方,方法定义上方
作用:设置对应属性的对象或对方法进行引用类型传参
范例

  1. @Autowired(required = false)
  2. private UserDao userDao;

说明

  • @Autowired默认按类型装配
  • 指定@Qualifier后可以指定自动装配的bean的id

    1. @Autowired
    2. @Qualifier("userDao")
    3. private UserDao userDao;

    相关属性

  • required:定义该属性是否允许为null

引用类型属性原生注解注入

名称:@Inject、@Named、@Resource
说明

  • @Inject与@Named是JSR330规范中的注解
  • @Inject = @Autowired ,@Named = @Qualifier完全相同
  • @Resource是JSR250规范中的注解,可以简化书写格式
  • @Resource相关属性
    • name:设置注入的bean的id
    • type:设置注入的bean的类型,接收的参数为Class类型

Bean装配优先级配置

名称:@Primary
类型:类注解
位置:类定义上方
作用:设置类对应的bean按类型装配时优先装配
范例

  1. @Component
  2. @Primary
  3. public class ClassName{}

说明

  • @Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级,多个@Primary会导致优先级设置无效

加载properties文件

名称:@PropertySource
类型:类注解
位置:类定义上方
作用:加载properties文件中的属性值
范例

  1. @PropertySource(value={"classpath:jdbc.properties","classpath:abc.properties"},ignoreResourceNotFound = true)
  2. public class ClassName {
  3. @Value("${propertiesAttributeName}")
  4. private String attributeName;
  5. }

说明

  • 不支持*通配格式
  • 一旦加载,所有spring控制的bean中均可使用对应属性值

相关属性

  • value(默认):设置加载的properties文件名
  • ignoreResourceNotFound:如果资源未找到,是否忽略,默认为false

纯注解格式

名称:@Configuration、@ComponentScan
类型:类注解
位置:类定义上方
作用:设置当前类为spring核心配置加载类
范例

  1. @Configuration
  2. @ComponentScan("scanPackageName")
  3. public class SpringConfigClassName{}

说明

  • 核心配合类用于替换spring核心配置文件,此类可以设置空的,不设置变量与属性
  • bean扫描工作使用注解@ComponentScan替代

AnnotationConfigApplicationContext

  • 加载纯注解格式上下文对象,需要使用AnnotationConfigApplicationContext
  • 当配置类作为 AnnotationConfigApplicationContext 对象创建的参数时,@Configuration注解可以不写
    1. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

第三方bean配置与管理

名称:@Import
类型:类注解
位置:类定义上方
作用:导入第三方bean作为spring控制的资源
范例

  1. @Configuration
  2. @Import(OtherClassName.class)
  3. public class ClassName {}

说明

  • @Import注解在同一个类上,仅允许添加一次,如果需要导入多个,使用数组的形式进行设定
  • @Import({JDBCConfig.class, Abc.class})
  • @Bean所在的类可以使用导入的形式进入spring容器,无需使用@Component声明
  • 在被导入的类中可以继续使用@Import导入其他资源(了解)