IOC(Inversion of Control):其思想是反转资源获取的方向。当某个Java对象(调用类)需要调用另一个Java对象(被调用类)的方法时,传统的做法有两种:
- 原始做法:调用者主动创建被依赖对象,然后再调用被依赖对象的方法,也就是用new的调用构造器
public class Test { public static void main(String[] args) { Account account=new Account(); //account实例调用User实例时需要new 一个实例; account.setUser(new User()); } }
- 简单工厂式(又称为静态工厂方法):调用者先找到被调用对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
![](https://i-blog.csdnimg.cn/blog_migrate/e144b29f1e5f1133127898f8088f52c8.png)
public interface Car {
//定义所有Car的方法
void driveCar();
void stopCar();
}
奥迪车实现接口,重写方法
public class Audi implements Car {
@Override
public void driveCar() {
System.out.println("启动奥迪");
}
@Override
public void stopCar() {
System.out.println("奥迪刹车");
}
}
宝马车实现接口,重写方法
public class Bmw implements Car {
@Override
public void driveCar() {
System.out.println("宝马启动");
}
@Override
public void stopCar() {
System.out.println("宝马停止");
}
}
创建实体工厂类CarFactory,所需要的Car实例由工厂类进行创建
public class CarFactory {
public Car getCar(String car) {
// TODO Auto-generated constructor stub
if ("audi".equalsIgnoreCase(car)) {
return new Audi();
} else if ("bmw".equalsIgnoreCase(car)) {
return new Bmw();
} else {
return null;
}
}
}
传统调用时都是需要先创建被依赖对象,然后再由调用对象进行调用,在应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源(声明成员变量,可以自动装配或者是ref进行引用), 这种行为也被称为查找的被动形式
DI(Dependency Injection) — IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接。Spring框架主要有两个改变:(1)程序无需使用new调用构造器去创建对象,所有的Java对象都可以交给Spring容器去创建;(2)当调用者需要调用被依赖对象的方法时,调用者无须主动获取被依赖对象,只要等待Spring容器注入即可。
设置注入
IOC容器通过成员变量setter方法来进行注入被依赖的对象,这种方式简单、直观因而在Spring中大量使用。
(1)普通属性赋值
public class User{
privateString username;
publicString getUsername() {
returnusername;
}
publicvoid setUsername(String username) {
this.username= username;
}
}
XML配置
<bean id="userAction"class="com.lsz.spring.action.User" >
<property name="username" value="admin"></property>
</bean>
(2)对象赋值
public class User{
private UserService userservice;
public UserServicegetUserservice() {
returnuser;
}
public void setUserservice(UserService userservice){
this.userservice= userservice;
}
}
XML配置
<!--对象的声明-->
<bean id="userService" class="com.lsz.spring.service.UserService"></bean>
<bean id="userAction"class="com.lsz.spring.action.User" >
<property name="userservice" ref="userService"></property>
</bean>
(3)注入集合值 Properties、Map、Set、List
Java代码变量设置,并添加setter方法
package org.jcq.bean;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.stereotype.Component;
@Component
public class User {
private List list;
private Set set;
private Map map;
private Properties properties;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
XML配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 打开自动扫描 -->
<context:component-scan base-package="org.jcq" />
<!-- Spring配置可以管理一切java对象和组件 -->
<bean id="string" class="java.lang.String"></bean>
<!-- 将user类交给Spring管理器进行管理 -->
<bean id="beingFactory" class="org.jcq.bean.BeingFactory"></bean>
<bean id="dog" factory-bean="beingFactory" factory-method="getBean">
<constructor-arg value="dog"></constructor-arg>
<property name="message" value="tian" />
</bean>
<bean id="user" class="org.jcq.bean.User">
<property name="list">
<list>
<value>集合属性1</value>
<value>集合属性2</value>
<value>集合属性3</value>
</list>
</property>
<property name="map">
<map>
<entry key="Java大法" value="99.0">
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="血压">正常</prop>
</props>
</property>
<property name="set">
<set>
<value>集合属性1</value>
<value>集合属性1</value>
</set>
</property>
</bean>
</beans>
(4)组合属性
Java代码配置
public class Account {
@Resource
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
XML配置
<bean id="account" class="org.jcq.bean.Account">
<property name="user.map">
<map>
<entry key="组合属性" value="success"></entry>
</map>
</property>
</bean>
(5)Spring3.0提供的Java配置管理