作者:jiangzz
电话:15652034180
微信:jiangzz_wx
微信公众账号:jiangzz_wy
概述
Spring IOC(Inverse of Control)是Spring框架的核心特性之一,IOC也被为DI(Dependency Inject)。其核心思想是通过构建一个容器服务/工厂服务用语管理日常开发过程中创建Bean的复杂问题。通过Spring工厂管理Bean的创建,消亡以及Bean间的依赖问题。解决早期开发中将程序间Bean的依赖关系硬编码,继而增强了可读性同时也实现了配置解耦。可以将Spring IOC架构如下图所示
从上图可以看出使用Spring的IOC个用户生产Bean其实需要以两个属性用户的业务实体bean、配置的元数据信息信息。Spring IOC项目主要依赖。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
Spring工厂可以根据用户提供的秒速信息生产对应的实体类。目前为止bean的配置元数据的描述方式有两种①XML Based Configuration②Annatation Based Configuration
XML Based Configuration
在项目的resource目录下创建一个配置文件applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.jiangzz.entities.User"/>
</beans>
Annatation Based Configuration
package com.jiangzz;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.jiangzz.entities.*;
@Configuration
public class ApplicationConfigBean {
@Bean
public User user(){
return new User();
}
}
初始化Bean工厂
如果是基于XML配置的描述信息,可以通过ClassPathXmlApplicationContext对象进行工厂的实例化
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
同样如果注解配置可以使用AnnotationConfigApplicationContext实例化Spring的工厂。
ApplicationContext ctx=new AnnotationConfigApplicationContext(ApplicationConfigBean.class);
以上两种方式就是Spring 在做IOC时候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 id="user" class="com.jiangzz.entities.User"></bean>
<!--引入子配置信息-->
<import resource="classpath:application-service.xml" />
</beans>
注意:
application-service.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
@Configuration
@Import(ApplicationServiceConfig.class)
public class ApplicationConfigBean {
@Bean
public User user(){
return new User();
}
}
注意:
ApplicationServiceConfig必须是一个配置类
package com.jiangzz;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationServiceConfig {
}
使用工厂Bean产生对象
配置文件
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user = ctx.getBean("user", User.class);
System.out.println(user);
注解配置
ApplicationContext ctx=new AnnotationConfigApplicationContext(ApplicationConfigBean.class);
User usera= ctx.getBean("user", User.class);
System.out.println(usera);
Bean初始化
- 无构造参数(即使是构造私有Spring可以创建)
<bean id="user" class="com.jiangzz.entities.User"/>
- 有构造参数
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date" value="com.jiangzz.DateEditor"/>
</map>
</property>
</bean>
<bean id="user" class="com.jiangzz.entities.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="jiangzz"/>
<constructor-arg name="sex" value="true"/>
<constructor-arg name="birthDay" value="1990-12-13"/>
</bean>
复杂属性转换
package com.jiangzz;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateEditor extends PropertyEditorSupport {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
@Override
public void setAsText(String value) throws IllegalArgumentException {
Date parse=null;
try {
parse = sdf.parse(value);
} catch (ParseException e) {
e.printStackTrace();
}
setValue(parse);
}
}
- 单例对象
public class UserService implements IUserService {
private static UserService instance;
private UserService(){}
public synchronized static UserService getInstance(){
if(instance==null){
instance=new UserService();
}
return instance;
}
}
<bean id="userService"
class="com.jiangzz.service.impl.UserService"
factory-method="getInstance"/>
- 复杂对象
package com.jiangzz;
import org.springframework.beans.factory.FactoryBean;
import com.jiangzz.entities.User;
import java.util.Date;
public class UserFactoryBean implements FactoryBean<User> {
public User getObject() throws Exception {
return new User(1,"jiangzz",true,new Date());
}
public Class<?> getObjectType() {
return User.class;
}
}
<bean id="user" class="com.jiangzz.UserFactoryBean"/>
ctx.getBean("&user")//获取的是UserFactoryBean对象
ctx.getBean("user")//获取的是UserFactoryBean#getObject对象
- FactoryBean创建
<bean id="userUtils" class="com.jiangzz.UserUtils"/>
<bean id="user" factory-bean="userUtils" factory-method="createUser"/>
package com.jiangzz;
import com.jiangzz.entities.User;
import java.util.Date;
public class UserUtils {
private static final User user=new User(1,"jiangzz",true,new Date());
public User createUser(){//该方法必须是非静态方法
return user;
}
}