Bean对象
1. 框架创建Spring Bean对象的方式有哪些
Spring框架提供了多种创建Bean对象的方式,具体包括:
-
Xml配置文件方式:是传统的方式,不推荐,通过在Spring的Xml配置文件中使用标签来定义Bean,指定其ID和类名。这种方式适用于纯Spring应用,但随着应用复杂度的增加,可能导致Xml配置文件过大,不便于管理。
<!-- 在Spring的XML配置文件中定义Bean --> <bean id="myBean" class="com.example.MyBeanClass"/>
-
注解方式:使用@Component、@Controller、@Service、@Repository等注解来标记一个类,这些注解将会被Spring容器自动扫描并创建单例对象。这种方法简化了配置,是现代Spring应用中常用的方式。
-
构造函数方式:如果一个类提供了默认的无参构造函数,Spring可以通过反射机制使用该构造函数来创建Bean对象。如果没有提供无参构造函数,则需要在Xml配置中明确指定使用哪个构造函数来创建对象。
-
工厂方法方式:可以在Spring的Xml配置文件中使用标签或着通过java配置类中的Bean注解来指定工厂方法,Spring将调用该方法来创建Bean实例。
<!-- 在Spring的XML配置文件中使用factory-method指定工厂方法 --> <bean id="myBean" factory-method="createMyBean"/>
// Java配置类中的@Bean注解指定工厂方法 @Configuration public class AppConfig { @Bean public MyBeanClass createMyBean() { return new MyBeanClass(); } }
-
AOP代理方式:在某些情况下,当启用了AOP时,Spring会为匹配切点表达式的Bean创建代理对象。这样,当获取到的对象实际上是一个代理对象,对其方法的调用可能会出发相关的增强逻辑(Advice)。
<!-- 启用AOP,为匹配切点表达式的Bean创建代理对象 --> <aop:config> <aop:pointcut id="myPointcut" expression="execution(* com.example.*.*(..))"/> <aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/> </aop:config> <bean id="myAdvice" class="org.springframework.aop.interceptor.DebugInterceptor"/>
Bean对象定义注解
注解 说明 @Component 该注解用于描述Spring中的Bean,它是一个泛化概念,仅仅标识容器中的一个组件Bean,用于可以作用在任何层次,使用时主要将该注解标注在相应的类上即可 @Controller 用于控制层(Controller层)的类表示为Bean @Service 用于业务层(Service层)的类表示为Bean @Repository 用于数据访问层(Dao层)的类表示为Bean Bean的获取方式
- 通过ApplicationContext的getBean()方法;
- 自动注入@Autowired注解
- 通过@Resouce注解
2. 依赖注入
-
@Value注解:@Value注入是将属性值直接注入到bean中,主要用于注入一些简单类型的属性(字符串、基本类型等)
-
@Autowired注解:@Autowired注入是将对象注入到bean中,并且在注入对象时会根据依赖注入容器中的bean的类型进行匹配,如果容器中有多个类型匹配的bean存在,则会抛出异常。该注解常用于注入复杂对象、接口类型的属性或其他bean实例。
- 根据类类型注入
- 根据接口类型注入
-
@Qualifier注解:@Qualifier是用于限定一个接口有多个实现类时,根据指定的限定条件来选择具体的实现类的注解。当Spring容器中存在多个实现统一接口的bean时,由于不能确定注入哪一个实现类,就需要通过@Qualifier注解来明确指定要注入的bean的名称。
-
@Resource注解:@Resource是JavaEE提供的注解之一,也支持在Spring Framework中使用。在Spring中,可以用来注入Bean实例,与@Autowired注解的作用类似。
- @Resource注解是JDK扩展包中的,级属于JDK的一部分。该注解是标准注解,而@Autowired注解是Spring框架的。
- 装配规则
- @Resource注解默认根据名称装配(byName)
- 当未指定name时,则使用属性名作为nane进行装配
- 如果通过name也未找到,则会自动启动通过类型byType装配
3. Bean的作用域
-
单实例(singleton):指某个类只能创建唯一的一个实例对象,并且该类提供一个全局的访问点(静态方法)来让外界获取这个实例,常用于只需要一个实例来处理所有任务的场景下。
-
多实例(Multiple):指可以在同一个类的定义下,创建多个实例对象。每个对象都是相互独立的,有自己的状态和行为;常用于需要同时处理多个任务的场景。
注解 | 说明 |
---|---|
@Scope(“singleton”)[默认] | 在IoC容器中,bean的对象为单例模式 |
@Scope(“prototype”) | 在IoC容器中,bean的对象为多例模式 |
4. Bean的生命周期
程序中每个对象都有生命周期,对象的创建、初始化、使用、销毁的整个过程称之为对象的生命周期。在对象创建以后需要初始化,应用完成以后需要销毁时执行的一些方法,可以称之为时生命周期方法。在Spring中,可以通过@PostConstruct和@PreDestory注解实现bena独享生命周期的初始化和销毁时的方法。
注解 | 说明 |
---|---|
@PostConstruct | 生命周期初始化方法,在对象构建以后执行 |
@PreDestory | 生命周期销毁方法【prototype作用域对象不执行此方法】 |
- 完整生命周期
- 实例化阶段(Bean对象创建):在这个阶段中,IoC容器会创建一个Bean的实例,并为其分配空间。这个过程可以通过构造方法完成。
- 属性赋值阶段:在实例化完成Bean之后,容器会把Bean中的属性值注入到Bean中,这个过程可以通过set方法完成。
- 初始化阶段(Bean对象初始化):在属性注入完成后,容器会对Bean进行一些初始化操作。
- 使用阶段:初始化完成后,Bean对象就可以被容器使用。
- 销毁阶段:容器在关闭时会对所有的Bean进行销毁操作,释放资源
5. 引用外部属性文件
使用流程如下:
1. 创建外部属性文件(在resources目录下创建文件,命名为***.properties)
2. 引入外部属性文件(使用@PropertySource(“classpath:文件名”)注解)
3. 获取外部属性文件中的变量值(使用${变量名}方式)
4. 进行属性值注入
6. 自动扫描配置
自动扫描配置是Spring框架提供的一种基于注解(Annotation)的配置方式,用于自动发现和注册Spring容器中的组件。当我们使用自动扫描配置时,只需要在需要被Spring管理的组件(如Service、Controller、Repository等)上添加对应的注解,Spring就会自动地将这些组件注册到容器中,从而可以在其他组件中使用。
在Spring中,通过@ComponentScan注解来实现自动扫描配置。
@ComponentScan注解用于指定要扫描的包或类。
Spring会在指定的包及其子包下扫描所有添加@Component等注解的类,把这些类注册为Spring Bean,并纳入Spring容器进行管理。