spring 注入和反转
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring 注入和反转内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring 注入和反转相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring 注入和反转相关知识
-
控制反转(IOC)和依赖注入(DI)概念IOC(inversion of control)控制反转模式;控制反转是将组件间的依赖关系从程序内部提到外部来管理; DI(dependency injection)依赖注入模式;依赖注入是指将组件的依赖通过外部以参数或其他形式注入; 两个说法本质上是一个意思。 例如:class DbMysql{ public function query(){} }class Controller{ public $db; public function __construct() { $this->db =
-
多种方式实现Spring的Bean注入Spring的核心是控制反转(IoC)和面向切面(AOP)。Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理 。Spring工厂是用于生成Bean,对Bean进行管理。在Spring中,所有Bean的生命周期都交给Ioc容器管理。Spring中,Spring可以通过Xml形式或注解的形式来管理Bean 。下面基于注解的形式,采用多种方式实现Spring的Bean注入。具体如下:一、通过方法注入Bean1. 通过构造方法注入Bean实例代码:@Component("anotherBean1") public class AnotherBean { }@Component public class MyBean1 { private AnotherBean anotherBean1;
-
大神聊聊使用 IOC 控制反转和 DI 依赖注入的意义其实我的标题没写对,这个话题我是聊不下去的。 本文只和小伙伴聊聊为什么使用容器注入,优缺点是什么。我通过问问题的方式让小伙伴了解这么做的意义 在开始之前我就可以告诉小伙伴使用容器注入的缺点了,尽管这很有争议 内存泄漏降低性能 那是否 IOC 控制反转意味着一定需要配合 DI 依赖注入?答案是不一定的,还有好多有趣的手段 那 DI 依赖注入和容器注入有什么关联?其实容器注入是依赖注入的一个核心方法,也就是现在用的最多的方法 那什么是容器注入
-
由Spring IOC容器来看Java中的反射只有自己亲身经历了、思考了,才能真正懂得。 这两天在学习Spring框架,在查阅IOC(控制反转)和DI(依赖注入)的资料时,阅读到一篇博客 关于Spring IOC (DI-依赖注入)你需要知道的一切,由最开始的问题产生来理解解耦合的需要、反射在解耦合中的应用以及Spring IOC的产生。之前也阅读过关于反射的文章,可是总感觉理解不到点上,而现在自己正在经历这个问题时,也就能更好地理解一些了。 为了方便阅读,以下是截取原文章的部分内容。同时建议参考慕课网上的一篇关于反射的手记:学习Java
spring 注入和反转相关课程
spring 注入和反转相关教程
- 1.1 控制反转 类似于 Spring 框架的 Ioc 容器,Maven 也沿用了这种做法,将其中与生命周期进行绑定的 Mojo Bean 进行托管,将对象的创建和控制权交与 Ioc 容器来进行管理。在 Ioc 容器中比较重要的一个概念就是依赖注入,在 Maven 编程的时候,会使用到两种依赖注入方式:构造器注入: 即在对象被创建的时候,通过构造器参数,将对象的值传入并赋值;set 方法注入: 即通过对象属性的 set 方法来为对象的属性赋值。总的来讲,在 Maven 中实现的 Ioc 容器和 Spring 中的 Ioc 容器是非常类似的。
- 3.3 Spring 的核心功能 大家对于使用 Spring 框架开发项目已经司空见惯了… 但是对于它的功能或者作用,描述出来总是差点什么,那么现在咱们详细聊一聊它的核心功能。核心功能:控制反转(IoC): 简单理解 IoC 是一种设计模式,将实例化对象的控制权 由手动的 new 变成了 Spring 框架通过反射机制实例化;依赖注入(DI): 首先理解依赖,程序运行的需要可以称之为依赖。由于 Spring 框架通过反射技术实例化了对象,并将对象的实例存入在容器进行管理。那么如果一个类中的属性为某个其余的类,属性无需手动赋值,通过 spring 的配置文件,或者 Spring 提供的注解,通过 spring 框架可以实现直接注入属性;面向切面编程 (AOP): 何谓切面,切面是数学中的一个概念,表示只有一个点接触到球体的一个平面称呼为切面,而接触点称呼为切点。那么在 Spring 中,切面编程指的就是在程序运行某个方法的时候,不修改原始执行代码逻辑,由程序动态地执行某些额外的功能,对原有的方法做增强,这就叫做面向切面编程,那个被监测的执行方法,称呼为切入点。知识小结:Spring 是分层的 Java SE/EE 应用 轻量级开源框架,以 IoC(Inverse of Control:控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多 著名的第三方框架和类库, 是使用最多的 Java EE 企业应用开源框架。使用 Spring 的意义在于:对于 bean 对象的实例管理更加方便,代码编写更加优雅,降低代码的耦合性,提升代码的扩展性。
- 1.前言 在第二个整个大章节,我们详细讲解了 控制反转,也就是对 bean 做实例化的部分。而我们知道 ,Spring 的核心功能是两个:控制反转 和 依赖注入。那么控制反转我们已经讲过,而依赖注入是什么呢?各位看官,随小可一起来…
- 2. 依赖注入案例 2.1概念介绍知识回顾对于依赖注入,我们在第一章第一节已经介绍过,我们回顾一下概念解释上面是我们之前对于依赖注入的一个通俗解释。那么这里再着重强调一下 IOC 控制反转与 DI 依赖注入的关系:IOC 控制反转是将对象实例化的动作交由了 Spring 框架, 它的作用是降低了程序的耦合,不需要我们手动的创建对象,但是程序的耦合性还是存在。对象中肯定会有一些其余对象的引用,那么这种引用就称呼为对象的依赖,而 DI 依赖注入其实 是 IOC 设计思想的一种表现形式。对于 这种属性依赖,我们无需手动赋予,也是讲赋值的动作交给 Spring ,那么这种操作就是 依赖注入。依赖注入方式:第一种方式是通过 xml 配置的方式实现;第二种方式是在属性或者方法上使用注解的方式实现。那么,本章节先带大家体验下 xml 方式实现依赖注入。2.2 工程实现:搭建动作介绍创建一个 maven 工程导入Spring 使用的依赖编写业务层的 Service 和持久层的 Dao java 类编写 Spring 的配置文件创建工程 导入依赖 省略可以参考之前创建过的IOC工程java 代码创建 Servcie 的接口和接口的实现类,代码如下://接口代码public interface UserService { public void deleteById(Integer id);}//实现类代码public class UserServiceImpl implements UserService { private UserDao userDao; public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void deleteById(Integer id) { System.out.println("删除的方法执行"); }}UserDao 接口和实现类代码://dao接口代码public interface UserDao {}//dao实现类代码public class UserDaoImpl implements UserDao {}代码解释: dao的接口和实现类中并没有方法,只是为了测试 作为service中的属性依赖,可以实现由 Spring 完成动态注入。重点来了:spring 的核心配置文件:配置解释:在上面的配置文件中:bean 标签是描述一个被实例化的类 而 property 则表示一类中的属性property 标签中的属性 name 一般我们写成类中的属性名称, 实际上,起决定作用的并不是属性名,下面示例再展示ref 表示当前的属性 是一个引用对象,而引用的是谁呢? ref 中的值 必须是在容器中已经实例化的一个引用对象的唯一标识。value 当前的属性可以直接赋值,所以通过 value 中,填写要赋予的数值即可测试结果代码解释可以看到 我们得到了 service 中的类属性 Userdao 的实例,并且也 得到了 字符串属性 userName的值 zs2.3 property注入属性的解释刚刚我们在上面的示例中 展示了xml依赖属性的注入,也是比较好理解。这里我们强调一下使用的注意事项:如果是 property 属性标签实现属性注入,那么类中必须由配置在 property 标签中 name 属性的 set 方法下面我们测试一下set方法的改变:先讲 service 中 dao 的 set 方法改造如下:public void setDao(UserDao userDao) { System.out.println("执行了set方法 给dao属性赋值"); this.userDao = userDao;}这时候代码中的set方法变成了 setDao 配置文件不变,依然是<property name="userDao" ref="userDao"></property>我们看看会产生什么问题Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'userDao' of bean class [com.wyan.service.UserServiceImpl]: Bean property 'userDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:247) at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:426) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:278) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:266) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:97) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:77) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1646)可以看到异常的堆栈信息 无效的 userDao 属性, userDao 不可以 或者 没有有效的 setter 方法提供。更改xml文件中的 property 标签的 name 属性 为 dao<property name="dao" ref="userDao"></property>测试结果如下:所以我们说 property 中的 name 属性不一定要跟 Java类中的属性名保持一致 而是必须跟 setter 方法的名称一致
- 4.2 注入 OutputStream 在控制器的方法中注入 OutputStream 对象,只需要在方法中添加参数声明。如下实例:可使用 OutputStream 对象读取指定文件中的内容后直接响应给浏览器。@RequestMapping(value = "/testApi05")public void hello(OutputStream outputStream) throws IOException { Resource res = new ClassPathResource("/test.txt"); FileCopyUtils.copy(res.getInputStream(), outputStream);}test.txt 文件的内容是”this is a test’。文件直接放在项目的 src/main/java 目录下。在浏览器中输入请求路径 http://localhost:8888/sm-demo/testApi05 。你将在浏览器中看到:有句话叫做 “条条道路通罗马”,用在 Spring MVC 中真的是合适,依靠 Spring 强大的注入功能,只要原生开发中能有的对象基本上都能注入进去。
- 4.2 通过反射读取注解 我们先来学习一下通过反射读取注解内容相关的 API。通过反射,判断某个注解是否存在于Class、Field、Method或Constructor:Class.isAnnotationPresent(Class)Field.isAnnotationPresent(Class)Method.isAnnotationPresent(Class)Constructor.isAnnotationPresent(Class)isAnnotationPresent()方法的返回值是布尔类型,例如,判断Student类中的nickname字段上,是否存在@Length注解:boolean isLengthPresent = Student.class.getDeclaredField("nickname").isAnnotationPresent(Length.class);通过反射,获取 Annotation 对象:使用反射 API 读取Annotation:Class.getAnnotation(Class)Field.getAnnotation(Class)Method.getAnnotation(Class)Constructor.getAnnotation(Class)例如,获取nickname字段标注的@Length注解:Length annotation = Student.class.getDeclaredField("nickname").getAnnotation(Length.class);通过反射读取注解的完整实例如下:public class Student { // 标注注解 @Length(min = 2, max = 5, message = "昵称的长度必须在2~6之间") private String nickname; public Student(String nickname) { this.setNickname(nickname); } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public static void main(String[] args) throws NoSuchFieldException { boolean isLengthPresent = Student.class.getDeclaredField("nickname").isAnnotationPresent(Length.class); if (isLengthPresent) { Length annotation = Student.class.getDeclaredField("nickname").getAnnotation(Length.class); // 获取注解的参数值 int min = annotation.min(); int max = annotation.max(); String message = annotation.message(); // 打印参数值 System.out.println("min=" + min); System.out.println("max=" + max); System.out.println("message=" + message); } else { System.out.println("没有在nickname字段上找到@Length注解"); } }}运行结果:min=2 max=5 message=昵称的长度必须在2~6之间运行过程如下:
spring 注入和反转相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议