帝国网站管理系统前台,平远县建设工程交易中心网站,北京网站开发公司,可以使页面具有动态效果的网站建设技术文章目录 一#xff1a;Spring_IOC概念引入_重要1#xff1a;Spring解耦合的原理2#xff1a;创建一个spring项目并实现IOC基本功能 二#xff1a;Spring_IOC原理分析 ***1#xff1a;XML解析技术读取配置文件**2**#xff1a;反射技术实例化对象,放到容器中3#xff1a… 文章目录 一Spring_IOC概念引入_重要1Spring解耦合的原理2创建一个spring项目并实现IOC基本功能 二Spring_IOC原理分析 ***1XML解析技术读取配置文件**2**反射技术实例化对象,放到容器中3工厂模式返回Bean对象 getBean方法解释一下IOC接口解释一下工厂模式 三spring中的Bean的管理:1管理的内容是什么1对象的创建 IOC2 属性的赋值 DI 2spring提供了两种管理bean的方式1基于XML方式的Bean管理2 基于注解方式的Bean管理 一Spring_IOC概念引入_重要 简单的说就是,创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转,spring创建对象时,会读取配置文件中的信息,然后使用反射给我们创建好对象之后在容器中存储起来,当我们需要某个对象时,通过id获取对象即可,不需要我们自己去new.
一句话:创建对象交给容器
1Spring解耦合的原理
图解
Spring IOC控制反转是 Spring 框架的一个关键概念它是指将对象的创建和依赖关系的管理从应用程序代码中转移到框架中进行管理的过程。
想象一下当我们在应用程序中使用对象时通常会直接使用 new 关键字来创建对象并在代码中处理对象之间的依赖关系。这意味着应用程序负责创建和管理对象。
然而在使用 Spring IOC 时控制权发生了转变。相反我们告诉 Spring 框架我们需要哪些对象而不是直接创建它们。Spring 框架负责创建对象并且还负责解决对象之间的依赖关系。这种控制权的转移称为控制反转。
具体来说Spring IOC 的实现方式是通过依赖注入Dependency Injection来实现的。在依赖注入中对象的依赖关系是通过将依赖项传递给对象的构造函数、属性或者方法来解决的。这样对象不再需要自己创建或者查找它们所依赖的对象而是通过框架来提供它们。
下面举一个简单的例子来说明 Spring IOC 的概念。假设我们有一个名为 UserService 的类它依赖于 UserDao 接口来进行数据库操作。在传统的方式下我们可能会在 UserService 类中创建一个 UserDao 对象如下所示
javaCopy codepublic class UserService {private UserDao userDao new UserDao();// 使用userDao进行数据库操作// ...
}而在使用 Spring IOC 的方式下我们可以使用依赖注入来解决对象的依赖关系。我们只需在 UserService 类中声明一个成员变量 UserDao并在需要使用它的地方将其注入进来
javaCopy codepublic class UserService {private UserDao userDao;// 使用setter方法进行依赖注入public void setUserDao(UserDao userDao) {this.userDao userDao;}// 使用userDao进行数据库操作// ...
}在配置文件或者使用注解的方式下我们可以告诉 Spring 框架将一个实现了 UserDao 接口的对象注入到 UserService 类中。这样我们就将对象的创建和依赖关系的管理交给了 Spring 框架实现了控制反转。
通过使用 Spring IOC我们的代码变得更加灵活、可测试和可维护。我们可以更方便地切换对象的实现而不需要修改依赖该对象的代码。此外由于对象的创建和管理由框架负责我们可以集中精力关注业务逻辑的实现而不必过多关注对象的创建和依赖关系的管理。 总结 spring IOC(控制反转) 主要指的是将对象的创建以及对象之间关系的依赖由原先的程序代码层转移到spring框架这些任务交给框架来完成。这样带来的优点是不需要重复的创建对象以及过度考虑对象之间的依赖关系简化代码让代码更灵活可测试可维护。 2创建一个spring项目并实现IOC基本功能
创建maven项目,设置maven
先创建一个空项目 名字可以是spring_all 在项目下创建模块 名字可以是spring_test_01 pom.xml中导入spring依赖
1. dependencies
2. dependency
3. groupIdorg.springframework/groupId
4. artifactIdspring-core/artifactId
5. version5.3.5/version
6. /dependency
7.
8. dependency
9. groupIdorg.springframework/groupId
10. artifactIdspring-beans/artifactId
11. version5.3.5/version
12. /dependency
13.
14. dependency
15. groupIdorg.springframework/groupId
16. artifactIdspring-context/artifactId
17. version5.3.5/version
18. /dependency
19.
20. dependency
21. groupIdorg.springframework/groupId
22. artifactIdspring-expression/artifactId
23. version5.3.5/version
24. /dependency
25.
26. /dependencies四个依赖介绍
spring-context 上下文,容器
spring-beans 创建对象
spring-core 核心jar
spring-expression 表达式jar
但是事实上,我们导入spring-context的时候,会自动导入其他依赖的jar,自动进行了依赖传递
所以,导入一个spring-context 依赖也可以 依赖传递关系图如下 为了方便测试,我们导入Junit测试依赖
1. dependency
2. groupIdjunit/groupId
3. artifactIdjunit/artifactId
4. version4.13.1/version
5. scopetest/scope
6. /dependency 在项目中定义一个接口和实现类
EmpDao接口和实现类 接口中定义一个方法并在实现类中实现
接口 实现类 在spring配置容器中的对象
创建spring配置文件 文件名没有明确要求,暂时可以叫spring 在spring.xml中配置一个需要由容器初始化的对象 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--在spring.xml中配置一个需要由容器初始化的对象--bean idEmpDaoimpl classcom.springIOC.Dao.impl.EmpDaoimpl/bean/beans测试通过容器获取对象 package com.springIOC.Dao.test;import com.springIOC.Dao.EmpDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test1 {Test//通过容器来获取对象。public void testGetBean() {//获取一个容器对象并读取spring.xml文件实例化配置文件中的对象后自动放入容器中。ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);//通过id从容器中获取对应的对象。EmpDao emptDao (EmpDao) applicationContext.getBean(EmpDaoimpl);//第二种写法后面的EmpDao.class的作用是告诉EmpDaoimpl所对应的值要强转成EmpDao类型。EmpDao empDaoimpl applicationContext.getBean(EmpDaoimpl, EmpDao.class);//调用对象的方法。emptDao.addEmp();}
}二Spring_IOC原理分析 ***
IOC底层原理 1XML解析技术读取配置文件 1. bean idempDao classcom.msb.dao.impl.EmpDaoImpl/bean将上面的信息读取进入程序 对象的ID ,一个是对象的类的全路径名 2反射技术实例化对象,放到容器中 获得类的字节码 Class clazz Class.forName(com.msb.dao.impl.EmpDaoImpl) 通过字节码实例化对象 Object obj clazz.newInstance(); 将对象放到一个map集合中 map.put(“empDao”,obj) 3工厂模式返回Bean对象 getBean方法 public Object getBean(String name){Object obj map.get(name); return obj;
} 解释一下IOC接口 BeanFactory 接口: IOC容器基本功能接口,是spring内部使用的接口,我们在处理业务时一般不直接使用该接口 ApplicationContext 接口: BeanFactory的子接口,提供更多更强大的功能,研发人员一般使用的接口 查看当前接口/类下的实现类/接口 – 快捷键CTRL H 解释一下工厂模式
工厂模式是一种软件设计模式它提供了一种创建对象的方法使得客户端代码与具体对象的创建过程分离从而提高代码的可维护性和灵活性。
想象一下你正在建造一座房子需要安装门。你可以自己亲自去制作门但这样做会非常耗时和复杂。相反你可以雇佣一个门厂来制造门并交付给你。在这个例子中门厂就是一个工厂它负责制造门的过程而你作为客户端只需告诉门厂你需要什么类型的门并接收到制造好的门。
在软件开发中工厂模式也是类似的。它定义了一个工厂类负责创建对象而客户端只需调用工厂类的方法传递相应的参数就可以获取到所需的对象。这样客户端不需要关心具体对象的创建细节只需与工厂类进行交互。
举个例子假设你正在开发一个电商网站需要根据用户选择的产品类型创建相应的产品对象。你可以使用工厂模式来实现。首先你创建一个抽象的产品类定义了产品的共同属性和方法。然后创建具体的产品类继承自抽象产品类实现各自的特定功能。接下来你创建一个工厂类该工厂类有一个方法根据用户选择的产品类型来创建相应的产品对象并将其返回给客户端。
客户端只需调用工厂类的方法传递用户选择的产品类型工厂类会根据选择创建相应的产品对象然后将其返回给客户端使用。这样客户端不需要知道具体产品对象的创建过程只需与工厂类进行交互就能获取到所需的产品对象。
工厂模式使得对象的创建与使用分离提供了一种灵活的方式来创建对象并且在需要添加新的产品类型时只需新增相应的产品类和对应的工厂方法而不需要修改客户端代码从而提高了代码的可维护性和扩展性。 总结工厂模式主要是将创建对象的过程与使用对象分离开。工厂类专门负责创建对象客户端只需调用工厂类的具体方法传入参数即可得到想要的对象。客户端不用关系对象的创建过程只需要与工厂进行交互。 三spring中的Bean的管理:
Bean(汉译咖啡豆). 又称JAVABean.其实就是JAVA程序程序中的一个个对象,所以Bean的管理其实就是spring对于JAVA程序中的对象的管理
1管理的内容是什么
1对象的创建 IOC IOC 叫做控制反转,就是Spring给我们创建对象,然后我们直接用,不用自己NEW,前面已经解释过 IOC处理的是对象如何创建的问题 2 属性的赋值 DI DI Dependency Injection即“依赖注入” 就是创建属性时给对象属性赋值 对象功能的实现往往要依赖属性的值,那么给对象属性赋值就可以说成是依赖注入 由于对象属性不仅仅是基本数据类型,还可能是其他类,或者引用类型 那么依赖注入将会把更多的对象之间的关系整理到一起,可以行程一个庞大的依赖关系 DI处理的是对象的属性赋值和互相依赖的关系 2spring提供了两种管理bean的方式
1基于XML方式的Bean管理
2 基于注解方式的Bean管理
小案例
创建新的模块并导入以下依赖
依赖
1. dependency
2. groupIdorg.springframework/groupId
3. artifactIdspring-context/artifactId
4. version5.3.5/version
5. /dependency
6.
7. dependency
8. groupIdjunit/groupId
9. artifactIdjunit/artifactId
10. version4.13.1/version
11. scopetest/scope
12. /dependency创建spring配置文件,一般spring的配置文件很多人约定俗称为application****.xml 准备一个要实例化的类
package com.spring.bean;public class User {private Integer userid;private String username;private String password;public Integer getUserid() {return userid;}public void setUserid(Integer userid) {this.userid userid;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}Overridepublic String toString() {return User{ userid userid , username username \ , password password \ };}public User() {System.out.println(无参构造器);}public User(Integer userid, String username, String password) {System.out.println(有参构造器);this.password password;this.userid userid;this.username username;}
}
IOC创建对象
通过无参构造方法构造对象
1. bean iduser1 classcom.msb.bean.User/bean标签的常见属性
1. bean iduser1 classcom.msb.bean.User nameuser1 scopeprototype lazy-inittrue /beanid 对象的id class 类的全路径名 name 和id类似,一般不用 scope 控制对象单例多例和使用范围 singleton作用域(scope 默认值), Spring IOC容器中只会存在一个共享的bean实例 / 单例模式prototype作用域部署的bean每一次获取都会产生一个新的bean实例相当与一个new的操作 request表示该针对每一次HTTP请求都会产生一个新的bean同时该bean仅在当前HTTP request内有效 session作用域表示该针对每一次HTTP请求都会产生一个新的bean同时该bean仅在当前HTTP session内有效 global session作用域类似于标准的HTTP Session作用域不过它仅仅在基于portlet的web应用中才有意义 lazy-init 懒加载 调用getBean的时候再去实例化对象 注意 1scope为prototype时也不会当即创建对象和懒加载一样getBean的时候才会创建两个不同的对象。 2prototype作用域是多例每次获取bean都会产生一个新的示例并且这个实例时通过原型模式的深拷贝来实现的 而懒加载仅针对单实例bean生效。 3在Spring 中当 bean定义了 scopesession属性时表示该 bean的作用域为 session即在同一个HTTP会话中该bean只会被创建一次在这个HTTP会话期间不论有多少个HTTP请求都会共享同一个bean实例。获取scope session的bean时需要通过spring容器来获取。 ID是不可以相同的但是同一个ID可以指向同一个对象