目录
概念
控制反转(Inversion of Control)是Spring框架的核心思想,它将传统应用程序中由开发者直接控制的对象的创建和管理权转移给Spring容器。这种设计模式实现了组件间的解耦,提高了代码的可维护性和可测试性。
特点
对象生命周期由Spring容器管理
开发者从主动创建对象变为被动获取对象
降低了组件间的耦合度
Spring对Bean的管理
对象创建机制
Spring提供了两种主要的对象创建方式:
基于XML配置:通过<bean>标签显式声明
基于注解:通过组件扫描自动发现和注册
e@Component:通用组件注解
@Service:业务逻辑层组件
@Repository:数据访问层组件
@Controller:表现层组件
依赖注入方式
XML配置方式
-
Setter注入:通过属性的setter方法注入
-
构造器注入:通过构造函数参数注入
注解方式
@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会自动调用该方法并注入参数
1488

被折叠的 条评论
为什么被折叠?



