IOC 配置 bean 方式

本文详细介绍了 Spring 中的 Bean 配置方式,包括 XML 配置、XML 配置实现、Java 配置、Java 配置实现、注解配置以及注解配置实现。XML 配置虽然结构清晰,但配置繁琐;Java 配置提供更高的灵活性,而注解配置则方便快捷,但对第三方资源支持有限。每种方式都有其适用场景和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. XML 配置

    (1)配置过程:将 bean 信息配置在 XML 文件里,先通过 Spring 的 ApplicationContext 加载 XML 文件,再通过 getBean 方法获取 bean 的实例。

    (2)优点:可以使用于任何场景,结构清晰,通俗易懂

    (3)缺点:配置繁琐,不易维护,枯燥无味,扩展性差

    (4)这种方式出现很多早前的 SSM 项目中,将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持 Spring 注解。

────────────────────────────────────────────────────────────

2. XML 配置实现

    (1)首先创建 spring-context.xml 文件

spring-context.xml 作用:用于注册 bean 信息、通常命名为 spring-context、springContext、ApplicationContext

    (2)声明命名空间和配置 bean。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--

bean 标签

    作用:注册 Bean

    属性:

id    在整个 spring-context.xml 文件中唯一,是当前类型在 Spring 容器中的唯一标识,不可以重复

class 对应当前类型的完整的包名.类名,用于实例化对象操作。

-->

<bean  id="userDao" class="www.springframework.dao.UserDaoImpl"></bean>

 

<!--

property 标签

    作用:配置 依赖对象

    属性:

Name 当前 bean 的依赖对象名称

ref   引用其他 bean 对象的 id

 

-->

<bean  id="userService" class="www.springframework.service.UserServiceImpl">

<property name="userDao" ref="userDao"/>

</bean>

</beans>

/* ClassPathXmlApplicationContext

作用:读取加载在 src/main/resources 目录下的 Spring 配置文件 spring-context.xml。

Spring 工厂读取加载对应的配置文件,bean 标签内容注册到 Spring 工厂中,方便后期实例化操作

*/

ClassPathXmlApplicationContext springFactory =

new ClassPathXmlApplicationContext("spring-context.xml");

// 利用 SpringFactory 工厂对象根据 bean 标签的 id 属性值,获取对应 class 实例化对象

UserDao userDao = (UserDaoImpl) springFactory.getBean("userDao");

────────────────────────────────────────────────────────────

3. Java 配置

    (1)Java 配置原理:将 bean 的创建交给开发者配置的 JavaConfig 类来完成,Spring 只负责维护和管理,采用纯 Java 创建方式。其本质上就是把 XML 上的配置声明转移到 Java 配置类中。

   (2)Spring 的 Java 配置方式是通过 @Configuration 和 @Bean 两个注解实现的:

@Configuration 作用于类上,相当于一个 XML 配置文件;

@Bean 作用于方法上,相当于 XML 配置中的<bean> 标签;

    (3)优点:适用于任何场景,配置方便,因为是纯 Java 代码,扩展性高,十分灵活

    (4)缺点:由于是采用 Java 类的方式,声明不明显,如果大量配置,可读性比较差

────────────────────────────────────────────────────────────

4. Java 配置实现

    (1)创建一个配置类, 添加 @Configuration 注解声明为配置类

    (2)创建方法,方法上加上 @bean,该方法用于创建实例并返回,该实例创建后会交给 Spring 管理,

方法名建议与实例名相同(首字母小写)。注:实例类不需要加任何注解

@Configuration

public class BeansConfig{

// "userDao" 为当前 bean 在 IOC 容器中的 key 值,不配置默认为首字母小写的方法名

@Bean("userDao")

public UserDaoImpl userDao(){

return new UserDaoImpl();

}

@Bean("userService")

public UserServiceImpl userService(){

UserServiceImpl userService = new UserServiceImpl();

userService.setUserDao(userDao());

return userService;

}

}

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeansConfig.class);

UserDao userDao = (UserDao) context.getBean("userDao");

System.out.println(userDao);

────────────────────────────────────────────────────────────

5. 注解配置

    (1)通过在自定义类上加注解的方式,来声明一个类交给 Spring 管理,Spring 会自动扫描带有 @Component、@Controller、@Service、@Repository 这四个注解的类,然后创建并管理此对象,前提是需要先配置 Spring 的注解扫描器。

@Repository

一般用于数据访问(数据访问(持久)层组件,实现 dao 访问)

@Service

一般用于服务( 业务层组件,处理业务逻辑,比如注入并操作 dao)

@Controller

一般用于控制器( 控制层组件 )

@Component

一般用于自定义组件,把普通类实例化到 Spring 容器中,相当于配置文件中的<bean/>

    (2)注解配置必须通过 JavaConfig 或 XML 实现 Spring 的注解扫描器方可使用

    (3)对于扫描到的注解类,Spring 默认当前 bean 在 IOC 容器中的 key 值为首字母小写的类名,可以在注解自定义 key 值

    (4)优点:开发便捷,通俗易懂,方便维护。

    (5)缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用 XML 或 JavaConfig 的方式配置

────────────────────────────────────────────────────────────

6. 注解配置实现

    (1)对自定义类添加 @Component 相关的注解,比如 @Controller,@Service,@Repository

    (2)配置 Spring 的注解扫描器:即 ComponentScan 的 basePackage

XML 方式配置

<context:component-scan base-package='tech.pdai.springframework'>,多个包名间用逗号隔开。

Java 配置实现

在 JavaConfig 类添加注解 @ComponentScan("tech.pdai.springframework") 或

new AnnotationConfigApplicationContext("tech.pdai.springframework") 时指定扫描的 basePackage

   (3)注解配置结合 XML 实现 Spring 的注解扫描器

@Repository

public class UserDaoImpl {

}

<context:component-scan base-package='com.qianfeng.dao'/>

ApplicationContext applicationContext = new GenericXmlApplicationContext("spring-context.xml");

UserDaoImpl userDaoImpl = (UserDaoImpl) applicationContext.getBean("userDaoImpl");

System.out.println(userDaoImpl);

   (4)注解配置结合 JavaConfig 实现 Spring 的注解扫描器

@Repository

public class UserDaoImpl {

}

方式一

@Configuration

@ComponentScan("com.qianfeng.dao")

public class BeansConfig {

}

ApplicationContext applicationContext = new GenericXmlApplicationContext("spring-context.xml");

UserDaoImpl userDao = (UserDaoImpl)applicationContext.getBean("userDaoImpl");

System.out.println(userDao);

方式二

ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.qianfeng.dao");

UserDaoImpl userDao = (UserDaoImpl)applicationContext.getBean("userDaoImpl");

System.out.println(userDao);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值