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:
part2:
配置文件中的标签
代码部分:
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,效果如图所示:
包扫描
代码部分:
@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,效果如图所示:
part2:
测试test2,效果如图所示:
part3:
测试test3,效果如图所示:
part4:
测试test4,效果如图所示:
part5:
测试test5,效果如图所示:
part6:
测试test6,效果如图所示:
part7:
测试test7,效果如图所示: