简单的说就是,创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转.
- spring创建对象时,会读取配置文件,配置文件中主要配置接口和实现类的关系,每个接口对相应一个实现类,使用
标签配置, )中的信息,然后使用反射给我们创建好对象 - 创建好之后在容器(这个容器里放的是map集合,key为接口id,value为所对应的实现类)中存储起来,当我们需要某个对象时,通过id(集合的key)获取对象即可,不需要我们自己去new.如果要使用别的实现类,只需要在配置文件中修改实现类的路径名,不用修改代码
一句话:创建对象交给容器,用的时候再去容器中取
Spring解耦合的原理
图解:
1.创建maven项目,设置maven
先创建一个空项目
2.名字可以是spring_all
在项目下创建模块 名字可以是spring_test_01
3.pom.xml中导入spring依赖
- <dependencies>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-coreartifactId>
- <version>5.3.5version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-beansartifactId>
- <version>5.3.5version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>5.3.5version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-expressionartifactId>
- <version>5.3.5version>
- dependency>
- dependencies>
四个依赖介绍
但是事实上,我们导入spring-context的时候,会自动导入其他依赖的jar,自动进行了依赖传递
所以,导入一个spring-context 依赖也可以
4.为了方便测试,我们导入Junit测试依赖
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.13.1version>
- <scope>testscope>
- dependency>
5.在项目中定义一个接口和实现类,接口中定义一个方法并在实现类中实现接口
EmpDao接口和实现类
6.在spring配置容器中的对象,创建spring配置文件, 文件名没有明确要求,暂时可以叫spring
7.在spring.xml中配置一个需要由容器初始化的对象
8.测试通过容器获取对象
1 XML解析技术读取配置文件
<bean id="empDao" class="com.msb.dao.impl.EmpDaoImpl">bean>
将上面的信息读取进入程序 对象的ID ,一个是对象的类的全路径名
2 反射技术实例化对象,放到容器中
3工厂模式返回Bean对象
使用getBean方法,getBena方法是BeanFactory 父接口下的一个方法,但一般我们使用ApplicationContext 接口去调用这个方法
- public Object getBean(String name){
- Object obj =map.get(name);
- return obj;
- }
IOC接口有两个
接口下的实现类
spring中的Bean的管理:
Bean(汉译咖啡豆). 又称JAVABean.其实就是JAVA程序程序中的一个个对象,所以Bean的管理其实就是spring对于JAVA程序中的对象的管理
管理的内容是什么:
管理了两部分,第一部分是对象的创建 也就是我们所说的 IOC,第二部分是属性的赋值 也就是我们所说的 DI, 先创建完属性才能赋值
1 对象的创建 IOC
IOC 叫做控制反转,就是Spring给我们创建对象,然后我们直接用,不用自己NEW,前面已经解释过
IOC处理的是对象如何创建的问题
2 属性的赋值 DI
DI :(Dependency Injection),即“依赖注入” 就是创建属性时给对象属性赋值
对象功能的实现往往要依赖属性的值,那么给对象属性赋值就可以说成是依赖注入
由于对象属性不仅仅是基本数据类型,还可能是其他类,或者引用类型
那么依赖注入将会把更多的对象之间的关系整理到一起,可以行程一个庞大的依赖关系
DI处理的是对象的属性赋值和互相依赖的关系
3.spring给我们提供了两种关于bean的方式
1 基于XML方式的Bean管理
2 基于注解方式的Bean管理
四 测试基于XML方式的Bean管理
1.创建新的模块并导入以下依赖
依赖
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>5.3.5version>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.13.1version>
- <scope>testscope>
- dependency>
2.创建spring配置文件,一般spring的配置文件很多人约定俗称为application****.xml
3.准备一个要实例化的类
- public class User {
- private Integer userid;
- private String username;
- private String password;
- @Override
- public String toString() {
- return "User{" +
- "userid=" + userid +
- ", username='" + username + '\'' +
- ", password='" + password + '\'' +
- '}';
- }
- public User() {
- System.out.println("noArgConstructor");
- }
- public User(Integer userid, String username, String password) {
- System.out.println("allArgConstructor");
- this.userid = userid;
- this.username = username;
- this.password = password;
- }
- public void setUserid(Integer userid) {
- System.out.println("setUserid");
- this.userid = userid;
- }
- public void setUsername(String username) {
- System.out.println("setUsername");
- this.username = username;
- }
- public void setPassword(String password) {
- System.out.println("setpassword");
- this.password = password;
- }
- }
4.IOC创建对象:通过无参构造方法构造对象
<bean id="user1" class="com.msb.bean.User">bean>
<bean id="user1" class="com.msb.bean.User" name="user1" scope="prototype" lazy-init="true" >bean>
以上主要是SpringIOC的IOC内容,后续会持续更新DI部分,以及AOP部分