Spring IOC容器总结

1.IOC(控制反转):由代码控制对象的创建,转变成了由容器控制对象的创建,需要时从容器中获取对象,这样对象的控制权就由程序变成了容器,这就是控制反转。控制反转是一种编程思想。
2. Spring是什么: Spring IOC容器就是对于IOC编程思想的实现。
3.放入容器:
3. lbean标签的形式
赋值操作:
(1)通过set方法进行赋值,属性注入:形如A a = new A(); a.setAge = 8;
(2)通过构造方法进行赋值,构造器注入,形如B b = new B(“张三”, “20”);
3.2包扫描注入形式
主要步骤:
(1)在配置文件中开启包扫描,并指定扫描的包
(2)在指定的包下创建类,并使用注解标注,使用到的注解: @Controller、 @Service、@Repository、 @Component
赋值操作:使用@Autowired注解进行属性的赋值,对于引用类型
4.取用
4.1byName:通过对象在IOC容器中的id或者name去取用,形如: getBean (“id或者name”);
4.2byType:通过对象的类型来进行取用,形如: getBean (类名. class);
4.3@Autowired:取用方式先根据byType来取用,取用失败后,再根据byName来进行取用其中id或者name就是变量的名字。

bean标签

代码部分:

Demo.java

/**
 * Demo类,用于演示bean标签的属性
 * @author Katrina
 *
 */
public class Demo {

}

bean-config.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,用于演示bean标签的属性 -->
	<!--
		bean标签的属性:
		scope:实例的范围,标注了实例获取时时单实例还是多实例的,singleton(每一次获取都一样)、prototype(每一次获取都是新的)、request(web:发送请求就会产生这个实例)、session(web:一个session共享一个实例,浏览器过来会产生一个实例),默认值是singleton 
	-->
	<bean id="demo" class="bean.Demo" scope="singleton"></bean>
	
</beans>

DemoTest.java

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * bean属性测试类
 * @author Katrina
 *
 */
public class DemoTest {

	//容器
	private ClassPathXmlApplicationContext context;
	
	/**
	 * 每次测试之前初始化容器
	 */
	@Before
	public void before() {
		context = new ClassPathXmlApplicationContext("demo-config.xml");
	}
	
	/**
	 * 测试bean的scope属性
	 */
	@Test
	public void test1() {
		//System.out.println("执行测试方法");
		Demo demo = (Demo) context.getBean("demo");
		System.out.println("demo的内存地址是:" + demo);
		
		Demo demo1 = (Demo) context.getBean("demo");
		System.out.println("demo的内存地址是:" + demo1);
	}

	/**
	 * 每次测试之后关闭容器
	 */
	@After
	public void after() {
		context.close();
	}
	
}
效果图:
part1:

spring 扫描的包路径_bean


spring 扫描的包路径_java_02

part2:

spring 扫描的包路径_java_03


spring 扫描的包路径_bean_04


了解更多bean标签的用法可点击本处

配置文件中的标签

代码部分:

bean-config.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,用于演示bean标签的属性 -->
	<!--
		bean标签的属性:
		scope:实例的范围,标注了实例获取时时单实例还是多实例的,singleton(每一次获取都一样)、prototype(每一次获取都是新的)、request(web:发送请求就会产生这个实例)、session(web:一个session共享一个实例,浏览器过来会产生一个实例),默认值是singleton 
	-->
	<bean id="demo" class="bean.Demo" scope="singleton"></bean>
	
	<!-- 
		导入标签的作用:
			1.导入其他配置文件
			2.模块化程序配置文件
	-->
	<import resource="classpath:import-config.xml"/>
</beans>

注意:如果resource内部的含包,例:config(package)内的import-config.xml,则路径为:<import resource="classpath:config/import-config.xml"/>

import-config.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="demo1" class="bean.Demo"></bean>
	
</beans>

Demo.java

/**
 * Demo类,用于演示bean标签的属性
 * @author Katrina
 *
 */
public class Demo {

}

DemoTest.java

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * bean属性测试类
 * @author Katrina
 *
 */
public class DemoTest {

	//容器
	private ClassPathXmlApplicationContext context;
	
	/**
	 * 每次测试之前初始化容器
	 */
	@Before
	public void before() {
		context = new ClassPathXmlApplicationContext("demo-config.xml");
	}
	
	/**
	 * 测试bean的scope属性
	 */
	@Test
	public void test1() {
		//System.out.println("执行测试方法");
		Demo demo = (Demo) context.getBean("demo");
		System.out.println("demo的内存地址是:" + demo);
		
		Demo demo1 = (Demo) context.getBean("demo");
		System.out.println("demo的内存地址是:" + demo1);
	}

	/**
	 * 测试import标签
	 */
	@Test
	public void test2() {
		Demo demo = (Demo) context.getBean("demo1");
		System.out.println("获取到的demo是:" + demo);
	}
	
	/**
	 * 每次测试之后关闭容器
	 */
	@After
	public void after() {
		context.close();
	}
	
}
效果图:

测试test2,效果如图所示:

spring 扫描的包路径_spring 扫描的包路径_05

包扫描

代码部分:

@Component(组件)、@Controller(控制器的标注)、@Service(service的标注)、@Repository(dao层的标注)

Demo.java

import org.springframework.stereotype.Component;
@Component
public class Demo {

	public void sayHello() {
		System.out.println("大家好,我是Demo");
	}
	
}

UserComponent.java

import org.springframework.stereotype.Component;
@Component
public class UserComponent {

}

UserControllor.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller(value = "userControllor")
public class UserControllor {

//	private UserService userService = new UserService(); //没有使用Spring IOC容器前的方式
	
	@Autowired //首先通过byType进行赋值,当赋值失败的时候再通过byName赋值(从武器包里面选枪AK,半自动等,根据类型,找不出来;把AK编号为1,则能够找出来)
	private UserService userService; //Spring IOC容器的创建方式
	
	/**
	 * 打印注入
	 */
	public void printService() {
//		System.out.println("注入的UserService是:" + userService);
		userService.sayHello();
	}
	
}

UserService.java

import org.springframework.stereotype.Service;
@Service(value =  "userService")
public class UserService {

	public void sayHello() {
		System.out.println("大家好我是UserService");
	}
	
}

UserDao.java

import org.springframework.stereotype.Repository;
@Repository(value = "userDao")
public class UserDao {
	
}

scan-config.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"
	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-4.3.xsd">

	<!-- 
		包扫描的步骤:
		1.创建类,并使用注解标注该类
		2.创建配置文件,并在配置文件中配置要扫描的包
		3.创建测试类
		使用的注意事项:
		1.需要注入到容器中的类必须使用注解标注,若不标注则不会注入容器
		2.要注入容器的类,必须在所扫描的包内,若不是则不会注入容器
		3.开启包扫描
		常用的纳入容器的注解:@Controller(控制器的标注)、@Service(service的标注)、@Repository(dao层的标注)、@Component(组件)
		默认id:使用注解标注类时,若不指定类的id,则类默认的id是类名小驼峰写法,比如:UserController -> userController
		包扫描会扫描指定包及其子包
	-->
	
	<!-- 包扫描 -->
	<context:component-scan base-package="scan"></context:component-scan>

</beans>

ScanDemoTest.java

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import scan.demo.Demo;
/**
 * 包扫描测试类
 * @author Katrina
 *
 */
public class ScanDemoTest {

	private ClassPathXmlApplicationContext context;
	
	@Before
	public void before () {
		context = new ClassPathXmlApplicationContext("scan-config.xml");
	}
	
	/**
	 * 演示@Component注解
	 */
	@Test
	public void test1() {
		UserComponent userComponent = (UserComponent) context.getBean("userComponent"); //默认类名改为小驼峰命名,如果不指定命名
		System.out.println("获取到的UserComponent是:" + userComponent);
	}
	
	/**
	 * 演示@Controllor注解
	 */
	@Test
	public void test2() {
		UserControllor userControllor = (UserControllor) context.getBean("userControllor"); //类名使用value设置
		System.out.println("获取到的UserController是:" + userControllor); 
	}
	
	/**
	 * 演示@Service注解
	 */
	@Test
	public void test3() {
		UserService userService = (UserService) context.getBean("userService");
		System.out.println("获取到的UserService是:" + userService);
	}
	
	/**
	 * 演示@Repository注解
	 */
	@Test
	public void test4() {
		UserDao userDao = (UserDao) context.getBean("userDao");
		System.out.println("获取到的UserDao是:" + userDao);
	}
	
	/**
	 * 演示@Autowired注解注入属性
	 */
	@Test
	public void test5() {
		UserControllor userControllor = (UserControllor) context.getBean("userControllor");
		userControllor.printService();
	}
	
	/**
	 * 演示取用方式为byName、byType
	 */
	@Test 
	public void test6() {
		//byName -> 通过名称获取
//		UserControllor userControllor = (UserControllor) context.getBean("userControllor"); //拿什么枪,按键,然后拿枪
		//byType -> 通过类型获取
		UserControllor userControllor = context.getBean(UserControllor.class); //拿什么枪,即拿枪
		userControllor.printService();
	}
	
	/**
	 * 演示取用方式为@Autowired
	 */
	@Test
	public void test7() {
		Demo demo = context.getBean(Demo.class);
		demo.sayHello();
	}
	
	@After
	public void after() {
		context.close();
	}
}
效果图:
part1:

测试test1,效果如图所示:

spring 扫描的包路径_bean_06

part2:

测试test2,效果如图所示:

spring 扫描的包路径_java_07

part3:

测试test3,效果如图所示:

spring 扫描的包路径_xml_08

part4:

测试test4,效果如图所示:

spring 扫描的包路径_xml_09

part5:

测试test5,效果如图所示:

spring 扫描的包路径_java_10

part6:

测试test6,效果如图所示:

spring 扫描的包路径_xml_11

part7:

测试test7,效果如图所示:

spring 扫描的包路径_spring 扫描的包路径_12