Spring IOC

目录

概念

特点

Spring对Bean的管理

对象创建机制

依赖注入方式

XML配置方式

注解方式

代码

配置依赖

Spring配置

传统方式和IOC方式对比

服务器定义:

Bean管理方式总结

xml方式

注解方式

纯注解方式

属性注入方式

Setter注入

构造器注入

字段注入

方法注入


概念

控制反转(Inversion of Control)是Spring框架的核心思想,它将传统应用程序中由开发者直接控制的对象的创建和管理权转移给Spring容器。这种设计模式实现了组件间的解耦,提高了代码的可维护性和可测试性。

特点

对象生命周期由Spring容器管理

开发者从主动创建对象变为被动获取对象

降低了组件间的耦合度


Spring对Bean的管理

对象创建机制

Spring提供了两种主要的对象创建方式:

基于XML配置:通过<bean>标签显式声明

基于注解:通过组件扫描自动发现和注册

e@Component:通用组件注解

@Service:业务逻辑层组件

@Repository:数据访问层组件

@Controller:表现层组件


依赖注入方式

XML配置方式

  1. Setter注入:通过属性的setter方法注入

  2. 构造器注入:通过构造函数参数注入

注解方式

@Value:注入基本类型值

@Autowired:按类型自动装配

@Qualifier:配合@Autowired按名称指定Bean

@Resource:Java标准注解,按名称注入


代码

配置依赖

<dependencies>
    <!-- Spring核心容器 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    
    <!-- 日志相关 -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    
    <!-- 测试框架 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 组件扫描配置 -->
    <context:component-scan base-package="com.qcby"/>
</beans>

传统方式和IOC方式对比

public class UserTest {
    
    // 传统创建对象方式
    @Test
    public void traditionalWay() {
        Demo demo = new Demo();
        demo.hello();
    }
    
    // IOC方式
    @Test
    public void iocWay() {
        // 1. 加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
        // 2. 从容器中获取Bean
        Demo demo = (Demo) context.getBean("demo");
        demo.hello();
    }
}

服务器定义:

@Service
public class Demo {
    public void hello() {
        System.out.println("Hello Spring IOC!");
    }
}

 

Bean管理方式总结

xml方式

<!-- 简单Bean定义 -->
<bean id="demo" class="com.qcby.Demo"/>

<!-- Setter注入 -->
<bean id="cat" class="com.qcby.Cat">
    <property name="age" value="10"/>
    <property name="name" value="Tom"/>
    <property name="demo" ref="demo"/>
</bean>

<!-- 构造器注入 -->
<bean id="user" class="com.qcby.User">
    <constructor-arg name="height" value="10.00"/>
    <constructor-arg name="name" value="张三"/>
    <constructor-arg name="demo" ref="demo"/>
</bean>

<!-- 复杂类型注入 -->
<bean id="dog" class="com.qcby.Dog">
    <property name="arr">
        <array>
            <value>1</value>
            <value>2</value>
        </array>
    </property>
    <property name="list">
        <list>
            <value>Item1</value>
            <value>Item2</value>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="key1" value="value1"/>
            <entry key="key2" value="value2"/>
        </map>
    </property>
</bean>

注解方式

@Service
public class UserServiceImpl implements UserService {
    
    @Value("${jdbc.url}")
    private String jdbcUrl;
    
    @Autowired
    private UserRepository userRepository;
    
    // ...
}

纯注解方式

@Configuration
@ComponentScan("com.qcby")
@PropertySource("classpath:app.properties")
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        // 配置数据源
        return new DruidDataSource();
    }
}

 

属性注入方式

Setter注入

XML配置:使用<property>标签

注解方式:在setter方法上使用@Autowired@Value

构造器注入

XML配置:使用<constructor-arg>标签

注解方式:在构造函数上使用@Autowired

字段注入

直接在字段上使用@Autowired@Value

方法注入

在任意方法上使用@Autowired,Spring会自动调用该方法并注入参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值