Spring(一)—— IOC实现

jar包官网

jar包官网jar下载地址:
https://repo.spring.io/libs-release-local/org/springframework/spring/

一、IOC概念

1.IOC控制反转(Inversion of Control): 控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。就是把对象的创建、初始化、销毁等工作交给spring容器来做,由spring容器来控制对象的生命周期。这主要是一个概念,是一种思想。
2.DI依赖注入(Dependency Injection): 是指程序运行过程中,若需要调用另一个对象协助时,无需在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起
**3.IOC与DI的关系:**IOC是一个概念,是一种思想,其实现方式多种多样,当前比较流行的实现方式之一是DI

二、XML配置方式

(一)普通构造注入

? 1.创建一个普通的Java工程,创建好Bean类User类和创建Junit测试类(Eclipse需要配置相应Spring插件)

public class User {
	public User(){
		System.out.println("调用了无参构造方法");
	}
	public void fly(){
		System.out.println("阁下何不同风起,扶摇直上九万里");
	}
}

? 2.导入jar包(context,core,expression,beans和依赖jar包commons.logging)
在这里插入图片描述
? 3.创建Spring的XML配置文件applicationContext.xml(声明User Bean:将自己信息告诉Spring容器,例如id和class,Spring容器根据class,通过反射对象)

<?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">
 
 <!-- 注册User对象 -->
 	<bean class="com.sxt.pojo.User" id="userId" name="userName" />
 </beans>

? 4.初始化Spring容器:applicationContext.xml中配置的所有类对象都会被创建,而且该方法会调用User类的无参构造,如果没有无参构造方法,会抛出NoSuchMethodExceptiop异常

	@org.junit.Test
	public void test2(){
		//初始化容器
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	}

运行结果:初始化容器会调用Bean User类的无参构造方法
在这里插入图片描述
? 5.可以通过容器中的getBean方法获取Spring容器中创建好的对象:id和name

@org.junit.Test
	public void test2(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//调用了无参构造方法
		//根据id获取对象
		User user1 = (User)ac.getBean("userId");
		//根据name获取对象
		User user2 = (User) ac.getBean("userName");
		user1.fly();//阁下何不同风起,扶摇直上九万里
		user2.fly();//阁下何不同风起,扶摇直上九万里
	}

运行结果:根据id和name都能获取到User对象
在这里插入图片描述
? 6.除了id和name之外,getBean还有其他重载方法可以获取Spring容器中的对象
在这里插入图片描述

@org.junit.Test
	public void test3(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		//根据User类的class类,如果applicationContext.xml文件中有2个User类的声明用该方法会报错
		User user = ac.getBean(User.class);
		user.fly();
		//根据class类和id或name属性获取对象
		User user2 = ac.getBean("userId", User.class);
		user2.fly();
	}

运行结果:
在这里插入图片描述
? 7.id和name的区别:在同一配置文件中ID不要出现重复的
id=“userID1,userID2,userID3”: 表示bean有一个名字,这个名字就是userID1,userID2,userID3
name=“user1,user2,user3”: 表示bean有多个名字,多个名字分别是user1、user2以及user3

<!-- applicationContext.xml -->
	<!-- 注册User对象 -->
 	<bean class="com.sxt.pojo.User" id="userID1,userID2,userID3" name="user1,user2,user3" />

? 8.BeanFactory和ApplicationContext的区别:

	/**
	 * 	4.ApplicationContext方式加载
	 */
	public void test4(){
		//创建容器的同时,容器初始化,容器所有的bean创建完毕
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		//去Spring容器中获取一个User对象
		User user = ac.getBean(User.class);
		user.fly();
	}
	/**
	 * 	5.BeanFactory方式加载,下面已过时
	 */
	public void test5(){
		//创建容器对象,BeanFactory当调用getBean获取响应对象时才创建对象
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("application.xml"));
		//去Spring容器中获取一个User对象
		User user = bf.getBean(User.class);
		user.fly();
	}

(二)静态工厂注入

? 1.创建静态工厂类

/**
 * 	User 静态工厂类
 */
public class UserFactory {
	/**
	 * 	必须是static静态方法
	 * @return
	 */
	public static User getInstance(){
		return new User();
	}
}

? 2.配置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">
 
 	<!-- 注册User对象 -->
 	<bean class="com.sxt.factory.UserFactory" factory-method="getInstance" id="user2" />
 </beans>

? 3.Junit测试类测试

@org.junit.Test
	public void test6(){
		//创建容器的同时,容器初始化,容器所有的bean创建完毕
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		//去Spring容器中获取一个User对象
		User user = ac.getBean(User.class);
		user.fly();
	}

在这里插入图片描述

(三)动态工厂注入

? 1.创建动态工厂类

/**
 * 	User 动态工厂类
 */
public class UserFactory {
	
	public User getInstance(){
		return new User();
	}
}

? 2.配置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">
 
 	<!-- 注册User对象 -->
 	<bean class="com.sxt.factory.UserFactory" id="userFactory1" />
 	<bean id="user" factory-bean="userFactory1" factory-method="getInstance"/>
 </beans>

? 3.Junit测试类测试

@org.junit.Test
	public void test6(){
		//创建容器的同时,容器初始化,容器所有的bean创建完毕
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		//去Spring容器中获取一个User对象
		User user = ac.getBean(User.class);
		user.fly();
	}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值