Spring IOC 三种配置方式详解
作者:黑影白
1 基于xml配置方式组件管理
1. 所有内容写到xml格式配置文件中
2. 声明bean通过<bean标签
3. <bean标签包含基本信息(id,class)和属性信息 <property name value / ref
4. 引入外部的properties文件可以通过<context:property-placeholder
<property>
是在 Spring XML 配置文件中用来设置 bean 的属性值的元素。在上下文中,它通常作为 <bean>
元素的子元素出现。通过 <property>
元素可以设置 bean 的属性,使得 Spring 容器在创建 bean 实例时可以自动将这些属性值注入到 bean 中。
例如,在上面提到的配置中,使用了 <property>
元素设置了数据源的 URL、驱动类名、用户名和密码等属性值。其基本结构如下:
id 属性指定了 bean 的唯一标识符。
class 属性指定了 bean 的类型。
<property> 元素用于设置 bean 的属性值,name 属性指定了属性名,value 属性指定了属性值。
使用 <property> 元素可以完成对各种类型属性的设置,例如基本数据类型、引用类型(如其他 bean)、集合类型等。
5. IoC具体容器实现选择ClassPathXmlApplicationContext对象
在 Spring 中,IoC 容器是负责实例化、配置和组装 bean 的核心容器。ClassPathXmlApplicationContext 是 Spring 提供的 IoC 容器实现之一,它从类路径下的 XML 配置文件中读取配置信息,并根据配置创建相应的 bean 实例
如图:
实现方式:
- 优点:XML配置方式提供了清晰的、结构化的方式来描述Bean之间的依赖关系。它非常适合大型项目,其中可能有数百个Bean需要配置。此外,XML配置提供了良好的可读性和可维护性,因为所有的配置都集中在一个或多个XML文件中。
- 缺点:XML配置可能会变得相当冗长和复杂,特别是当项目中的Bean数量增加时。此外,XML配置是静态的,这意味着在运行时更改配置可能会比较困难。
2 基于注解方式管理
1. 注解负责标记IoC的类和进行属性装配
2. xml文件依然需要,需要通过<context:component-scan标签指定注解范围
3. 标记IoC注解:@Component,@Service,@Controller,@Repository
- @Component:
- 这是最通用的Spring组件注解,标识一个类为Spring组件。被
@Component
注解的类将会作为候选组件被Spring的上下文进行扫描和自动配置。 - 它不携带任何特殊的语义信息,仅仅表明该类是一个Spring组件。
- 这是最通用的Spring组件注解,标识一个类为Spring组件。被
- @Service:
- 用于标识业务逻辑层的组件(如服务类)。
@Service
是@Component
的一个特殊化版本,它提供了更加明确的语义,表明这个类是一个服务组件。- 通常,服务层负责实现业务逻辑,调用数据访问层(由
@Repository
标识的组件)来获取数据,并可能将结果传递给表示层(由@Controller
标识的组件)。
- @Controller:
- 用于标识Web应用中的控制器组件。
@Controller
是@Component
的一个特殊化版本,用于处理HTTP请求,通常与Spring MVC一起使用。- 在控制器中,你可以定义方法来处理特定的HTTP请求,并返回视图名称或响应体。
- @Repository:
- 用于标识数据访问层的组件(如DAO类)。
@Repository
是@Component
的一个特殊化版本,它提供了更加明确的语义,表明这个类是一个数据访问组件。- 在数据访问层,你可以定义方法来访问数据库、执行CRUD操作等。
- Spring提供了额外的异常转换功能,可以将来自数据访问层的异常转换为
DataAccessException
类型的异常,这使得开发者可以更容易地处理这些异常。
4. 标记DI注解:@Autowired @Qualifier @Resource @Value
- @Autowired
@Autowired
是Spring提供的一个注解,用于自动装配bean。它可以自动装配构造器、setter方法或字段。当Spring容器在创建bean时,如果bean中包含了使用@Autowired
注解的属性或方法,Spring容器将自动查找匹配的bean进行注入。- 如果存在多个相同类型的bean,Spring将不知道要注入哪一个,这时就需要使用
@Qualifier
注解来指定要注入的bean的名称。 - 默认情况下,
@Autowired
是必需的(即如果找不到匹配的bean,则会抛出异常)。但是,你可以通过@Autowired(required = false)
来指定注入是可选的。
- @Qualifier
@Qualifier
通常与@Autowired
一起使用,用于消除多个相同类型bean的歧义。当Spring容器中存在多个相同类型的bean时,你可以使用@Qualifier
注解来指定要注入的bean的名称。@Qualifier
可以用在方法、字段或构造器参数的上面,但最常见的用法是结合@Autowired
一起使用在字段或setter方法上。
- @Resource
@Resource
是Java EE提供的注解,用于注入资源,如JavaBean、数据源等。在Spring中,它也可以用于自动装配bean。@Resource
可以指定要注入的bean的名称(通过name
属性)或类型(通过type
属性)。如果同时指定了name
和type
,Spring将首先按name
查找,然后按type
查找。@Resource
的一个优点是,即使没有匹配的bean,它也不会抛出异常(这取决于@Resource
的具体用法和配置)。
- @Value
@Value
注解用于注入SpEL(Spring Expression Language)表达式、属性文件中的值或字面量值。- 你可以使用
@Value
来注入基本类型、字符串、其他bean的属性或SpEL表达式的结果。 - 例如,你可以使用
@Value("${some.property}")
来注入属性文件中的值,或者使用@Value("#{someBean.someProperty}")
来注入其他bean的属性值。
5. IoC具体容器实现选择ClassPathXmlApplicationContext对象
如图:
调用:
- 优点:注解配置方式将配置信息直接嵌入到Java代码中,使得代码和配置更加紧密地结合在一起。这减少了配置文件的数量,使得项目更加简洁。此外,注解配置支持在运行时动态地修改配置,这增加了灵活性。
- 缺点:过度使用注解可能会导致代码混乱和难以维护。此外,注解配置不如XML配置直观,可能需要更多的时间来学习和理解。
3 配置类方式管理
1. 完全注解方式指的是去掉xml文件,使用配置类 + 注解实现
2. xml文件替换成使用@Configuration注解标记的类
3. 标记IoC注解:@Component,@Service,@Controller,@Repository
4. 标记DI注解:@Autowired @Qualifier @Resource @Value
5. <context:component-scan标签指定注解范围使用@ComponentScan(basePackages ={"com.atguigu.components"})替代
6. <context:property-placeholder引入外部配置文件使用@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})替代
7. <bean 标签使用@Bean注解和方法实现
8. IoC具体容器实现选择AnnotationConfigApplicationContext对象
配置类:
调用:
- 优点:JavaConfig配置方式使用Java类来定义Bean及其依赖关系,这使得配置更加类型安全,并且易于使用IDE的功能(如自动补全和重构)。此外,JavaConfig配置支持在运行时动态地修改配置,并且可以与XML和注解配置混合使用。
- 缺点:JavaConfig配置需要编写额外的Java代码来定义Bean和依赖关系,这可能会增加项目的复杂性。此外,JavaConfig配置可能不如XML配置直观,特别是对于初学者来说。
以上就是Spring IOC 三种配置方式详解的详细内容,更多关于Spring IOC配置的资料请关注脚本之家其它相关文章!