一、Spring 的两种核心容器:BeanFactory 和 ApplicationContext(都通过xml加载Bean的)
二、通过ApplicationContext实例化:
1.通过ClassPathXmlApplicaationContext创建
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
configLocation参数用于指定Spring配置文件的名称和位置。
如果其值为“applicationContext.xml”,则Spring会去类路径中查找名为applicationContext.xml的配置文件
Spring配置文件名称可自定义,一般开发都定为applicationContext.xml(有时也定为beans.xml)
所以常用语句就是:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
表示初始化spring容器,加载配置文件。
2.通过FileSystemXmlApplicationContext创建
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
不是从类路径中读取配置文件,而是通过参数指定配置文件的位置,例如:"D:/workspaces/applicationContext.xml",如果参数中写的不是绝对路径,调用时默认用绝对路径。灵活性差,不推荐。
然后,xml文件是啥?类似这种东西,除了<bean>,其他照抄,用多了自然就会懂。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
6 <!-- 将指定类配置给Spring,让Spring创建其对象的实例 --> 7 <bean id="userDao22" class="com.itheima.ioc.UserDaoImpl" /> 8 9 <!--添加一个id为userService的实例 --> 10 <bean id="userService" class="com.itheima.ioc.UserServiceImpl"> 11 <!-- 将id为userDao22的Bean实例注入到userService实例中,name属性表示Bean实例中的相应属性名,ref属性用于指定其属性值 --> 12 <property name="userDao" ref="userDao22" /> 13 </bean> 14 15 </beans>
通过容器获取实例:
类名 + 对象名 = (强转类名)+ applicationContext.getBean(String name/id);
比如:UserService userService = (UserService) applicationContext.getBean("userService");
三、控制反转和依赖注入
1.控制反转(IoC,Inversion of Control):说白了就是不用new,用容器获取对象,把创建和查找依赖对象的控制权交给了容器。
2.依赖注入(DI,Dependency Injection):使用Spring框架创建对象时,动态地将其所依赖的对象注入Bean组件中,两种方法。(1)属性setter方法注入,指Spring容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法。(2)构造方法注入:指Spring容器使用构造方法注入被依赖的实例。
书上多少个名字重合的,都不知道哪个匹配哪个,现有以下几个接口和实现接口的类
package com.itheima.ioc; public interface UserDao { public void say(); }
package com.itheima.ioc; public class UserDaoImpl implements UserDao { public void say() { System.out.println("userDao say hello World 222!"); } }
package com.itheima.ioc; public interface UserService { public void say(); }
package com.itheima.ioc; public class UserServiceImpl implements UserService { // 声明UserDao属性 private UserDao userDao44; // 添加UserDao属性的setter方法,用于实现依赖注入 public void setUserDao(UserDao userDao) { this.userDao44 = userDao; } // 实现的接口中方法 public void say() { //调用userDao中的say()方法,并执行输出语句 this.userDao44.say(); System.out.println("userService say hello World !"); } }
测试IoC,很简单地调用say方法,本章看不出什么门道。
package com.itheima.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestIoC { public static void main(String[] args) { //1.初始化spring容器,加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.通过容器获取userDao实例 UserDao userDao111 = (UserDao) applicationContext.getBean("userDao22"); //3.调用实例中的say()方法 userDao111.say(); } }
输出:userDao say hello World 222!
测试DI:
package com.itheima.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { public static void main(String[] args) { //1.初始化spring容器,加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.通过容器获取UserService实例 UserService userService = (UserService) applicationContext.getBean("userService"); //3.调用实例中的say()方法 userService.say(); } }
输出:
userDao say hello World 222!
userService say hello World !