Bean的定义
bean的四种注解定义格式:Component, Controller, Service, Repository
名称:@Component 定义一个bean
类型:类注解
位置:类定义上方
作用:设置该类为spring管理的bean
范例:
@Component("userService")
public class UserServiceImpl implements UserService {}
说明:@Component的衍生注解,功能类似@Component
- @Controller(表现层)
- @Service(业务层)
- @Repository(数据层)
相关属性
- value(默认):定义bean的访问id
@Component(value="beanId")
public class ClassName{}
Bean的作用域
bean相关属性注解格式:Scope, PostConstruct(方法上), PreDestroy(方法上)
名称:@Scope
类型:类注解
位置:类定义上方
作用:设置该类作为bean对应的scope属性
范例:
@Scope("singleton")
// @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
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对应的生命周期方法
范例:
@PostConstruct
public void init() { System.out.println("init..."); }
@PreDestroy
public void destroy() {}
加载第三方资源
名称:@Bean
类型:方法注解
位置:方法定义上方
作用:设置该方法的返回值作为spring管理的bean
范例:
@Component
public class JDBCConfig {
@Bean("dataSource")
public DruidDataSource createDataSource() { return ……; }
}
说明:
- 因为第三方bean无法在其源码上进行修改,使用@Bean解决第三方bean的引入问题
- 该注解用于替代XML配置中的静态工厂与实例工厂创建bean,不区分方法是否为静态或非静态
@Bean所在的类必须被spring扫描加载,否则该注解无法生效
@Component
public class JDBCConfig {}
相关属性
value(默认):定义bean的访问id
Bean属性注入
- 非引用类型注入
- @Value
- 引用类型注入
- @Autowired = @Inject
- @Qualifier = @Named
- @Primary
- @Resource: name, type
非引用类型属性注入
名称:@Value
类型:属性注解、方法注解
位置:属性定义上方,set方法定义上方
作用:设置对应属性的值或对方法进行传参
范例:
@Value("zhangsan")
private String username;
说明:
- value值仅支持非引用类型数据
- value值支持SpEL:@Value(“#{‘zhangsan’}”)
- @value注解如果添加在属性上方,可以省略set方法
value值支持读取properties或yml文件中的属性值,通过类属性将properties或yml中数据传入类中
@Value("${address.host1}")
@Value("${address.host1:127.0.0.1}")// 加冒号可设置默认值
@Value("${address.host1:}") // 默认值为空字符串""
private String host1;
相关属性
value(默认):定义对应的属性值或参数值
引用类型属性注入
名称:@Autowired、@Qualifier
类型:属性注解、方法注解
位置:属性定义上方,方法定义上方
作用:设置对应属性的对象或对方法进行引用类型传参
范例:
@Autowired(required = false)
private UserDao userDao;
说明:
- @Autowired默认按类型装配
指定@Qualifier后可以指定自动装配的bean的id
@Autowired
@Qualifier("userDao")
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按类型装配时优先装配
范例:
@Component
@Primary
public class ClassName{}
说明:
- @Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级,多个@Primary会导致优先级设置无效
加载properties文件
名称:@PropertySource
类型:类注解
位置:类定义上方
作用:加载properties文件中的属性值
范例:
@PropertySource(value={"classpath:jdbc.properties","classpath:abc.properties"},ignoreResourceNotFound = true)
public class ClassName {
@Value("${propertiesAttributeName}")
private String attributeName;
}
说明:
- 不支持*通配格式
- 一旦加载,所有spring控制的bean中均可使用对应属性值
相关属性
- value(默认):设置加载的properties文件名
- ignoreResourceNotFound:如果资源未找到,是否忽略,默认为false
纯注解格式
名称:@Configuration、@ComponentScan
类型:类注解
位置:类定义上方
作用:设置当前类为spring核心配置加载类
范例:
@Configuration
@ComponentScan("scanPackageName")
public class SpringConfigClassName{}
说明:
- 核心配合类用于替换spring核心配置文件,此类可以设置空的,不设置变量与属性
- bean扫描工作使用注解@ComponentScan替代
AnnotationConfigApplicationContext
- 加载纯注解格式上下文对象,需要使用AnnotationConfigApplicationContext
- 当配置类作为 AnnotationConfigApplicationContext 对象创建的参数时,@Configuration注解可以不写
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
第三方bean配置与管理
名称:@Import
类型:类注解
位置:类定义上方
作用:导入第三方bean作为spring控制的资源
范例:
@Configuration
@Import(OtherClassName.class)
public class ClassName {}
说明:
- @Import注解在同一个类上,仅允许添加一次,如果需要导入多个,使用数组的形式进行设定
- @Import({JDBCConfig.class, Abc.class})
- @Bean所在的类可以使用导入的形式进入spring容器,无需使用@Component声明
- 在被导入的类中可以继续使用@Import导入其他资源(了解)