URL:https://blog.csdn.net/d124939312/article/details/79022984

注入简介

Spring注入可以理解为是对一个对象进行初始化,也就是省去new的这个步骤,类似于工厂模式一样,通过一个工厂制造出这个对象,如果遇到修改,只需要改一处就行了。实现spring注入一般有两种方法,配置文件,或者用注解。各有不同的作用。

注意:本文中涉及到所以例子均默认加入了spring的包,如果没有加入spring包可以自己百度一下用maven或者手动下载spring的依赖包(这里就不给博客了,还是应该自己动动手吧)

配置注入:

不重复造轮子,这里已经说明得很清楚了,介绍了两种方式,set注入和构造注入,并且都很详细。至于这篇文中提及到的第三种:接口注入,本人小白观点,应该用interface来注入,在用mybatis框架时一般会接触到,注入这里本人也不介绍这个了,因为涉及到mybatis另一个框架,比较复杂。

PS:这位作者写的spring系列文章的确可以参考一下,本人也从中获益良多。

http://blog.csdn.net/lishuangzhe7047/article/details/20740835

注解注入:

自动装配

在了解注解注入之前,需要先了解一下自动装配这个概念,这篇博客也说得比较详细,可以先参考这个知道一些概念,由于这篇博客没有给出很详细的例子,所以这里本人会给个例子。

http://blog.csdn.net/lishuangzhe7047/article/details/20742427

首先介绍一下文件结构,Main主要来调试运行,Bean其中一个对象,Test,Bean所依赖的一个对象(也就是Bean成员里有Test对象),如图:

Main.class

Bean.class

Test.class

这里是配置文件

从这里可以看出,在bean那里有一个autowrite,这个字段就是用来自动装配的。可以看见在<property>这个标签中我没有写test的引用,这就是自动装配,可以根据名字(byName),也可以根据类型(byType)。所以这里的输出如下

如果这里我去掉了autowirte这个字段,由于我也没有在<property>里面引用test,所以这里的test会是空,并且会报错,因为Bean里面的test没有被初始化,所以test里面的getN调用不了,会NullPointer,如下图所示。

这里,基于去掉autowrite的基础上,我加一个<property>的test引用,这样又变成了手动装配了,就和上面给的第一篇博客的做法一样了。配置文件如下

所以其实自动装配其实就是类A中有对类B的依赖关系(即A类的成员中B类的成员,记得这概念啊),然后可以通过自动注解初始化B类(但还是需要在配置文件中写B类的<bean>标签的)

注解注入

了解了自动装配,就可以了解一下注解注入,因为就是基于自动装配这一概念的,不同的是注解注入不用在配置文件中配置这么多,只需要配置一点点就可以了,剩下的全部用注解来实现。

还是刚刚那个例子,把配置文件改一下,去掉那些<bean>标签,加一个这个标签

其中base-package是自己的包名,如果有多个包名可以用分号隔开(分号在引号中)

然后再在目标类上面增加一些注解,如图

Bean.class

仅仅在类上面加了个注解,这里的注解其实也可以写@Controller或者@Service,这些个注释从注入效果来说没有什么区别,只是一些逻辑的不同,可以理解为一个变量可以这样声明int number,也可以这样声明int n,只是名字不同而已。然后在Test那个地方加了一个@Resource,其实也可以写@Autowirte,不过官方貌似比较推荐些@Resource,其实两个作用也是一样的。这里的@Resource就可以理解为是配置文件中autowirte字段,这里的@Repository可以理解为配置文件里面的<bean>标签。

Test.class

Main.class不变

然后这样运行一下,如图

发现Bean中的String 对象是null,int值是0,而test的int 也是0。这里其实就是没有给这些字段初始化。但是Bean对象和Test是初始化了的(要追究到jvm的话就是Bean和Test都申请了一块内存)。这里也可以理解为调用了Bean和Test的默认构造函数,以为默认构造函数是空的,所以就是什么都没有初始化。这里也可以自己重写默认构造函数,例如把Test.class里面的默认构造函数那段注释去掉,然后运行结果如下:

这就是注解注入

配置注入VS注解注入

其实可以看出来,这两种的本质其实就是调用了构造函数,不过配置注入中的set注入是在调用构造函数后从配置文件里面读值然后set进去,构造注入是选择了特定的构造函数进行构造。注解注入就是调用了默认构造函数。如果要在注解注入中初始化对象成员中的值(例如本例中Bean的String 对象的值),那就需要在默认构造函数中进行初始化。

选择配置注入的好处

配置注入其实和工厂模式差不多,但选择配置注入的好处在于可以把值和代码分开,方便管理,可以在配置文件中赋值

选择注解注入的好处

虽然注解注入又把注解和代码混在一起了,但是也可以方便把配置和类对应起来,而且配置比较简单,写个注解就行了。但是如果你要用注解配置初始化值,就只能在默认构造函数中写。

所以一般常用的是,如果需要值的注入,一般用配置注入,例如数据库连接类,就也可以在那里初始化用户名和密码;如果是无具体值的类,例如只用方法的类,像那些controller和那些service,虽然里面有一些对象,但这些对象不需要给什么值,只要new一个对象就行了,这种一般就用注解注入。

--------------------- 本文来自 蜗牛-d124939312 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/d124939312/article/details/79022984?utm_source=copy

spring中注入方式相关推荐

  1. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  2. Spring的注入方式详解

    [html] view plaincopy Spring的注入方式详解 Spring有三个注入方式,type1,type2,type3 type1  接口依赖 type2  setter/getter ...

  3. Spring bean注入方式

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html  Spring bean提供了3中注入方式:属 ...

  4. spring的注入方式

    下面展示spring的注入方式,主要是: 两个接口: Axe.java: package com.jim.service; public interface Axe { public String c ...

  5. 最全的 Spring 依赖注入方式,你都会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 Spring 正如其名字,给开发者带来了春天,Spring 是为解决企业级应用开发的复杂性而设计的一款框架,其设计理念就是:简 ...

  6. Spring依赖注入方式

    一.依赖注入(DI)简介     依赖注入背后的基本原理是对象之间的依赖关系,可以通过以下几种方式来实现:构造器的参数.工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性.因此,容器的工作就 ...

  7. java bean spring_Java+Spring+Bean+注入方式

    1.首先准备共享文件 调用方法Client端Client.java: import org.springframework.context.support.ClassPathXmlApplicatio ...

  8. Spring 中注入什么意思?

    当你需要写某模块代码时,如果正常需要new其他的类,利用注入,直接用注解,就可以用对象了,如果不注入,那么对应的类是没办法用的,你的这个模块就无法调用它. spring通过"控制反转&quo ...

  9. spring 内部类注入方式

    一个DAO中既要继承HibernateDaoSupport也要继承SqlMapClientDaoSupport,即:hibernate和ibatis同时使用.内部类可以解决多继承的问题,但是如何注入内 ...

最新文章

  1. 骚操作 !用 Python 偷偷抓取女朋友的行踪(女朋友在哪里)
  2. Mybatis一级缓存、二级缓存
  3. ubuntu21.04下终端路径显示优化
  4. 最新综述:对话式检索数据集汇总
  5. memcache的深度解析(转)
  6. Apache TomEE(和Tomcat)的自签名证书
  7. add_argument函数action参数的store_true==》在运行程序添加参数时直接输入变量名,可以省略对应的默认值True或者False
  8. 史上最全的php面试题-带有答案,史上最全的PHP面试题-带有答案
  9. SaaS架构设计之如何转化成SaaS多租户模式
  10. 计算机网络自顶向下方法 【第一章 计算机网络及因特网】
  11. 四维图新地图坐标_移动端地图技术分享
  12. VirtualBox实现文件与主机复制粘贴
  13. 关于Employee 类的使用
  14. 使用讯飞语音识别的空指针错误
  15. LVS负载均衡群集——NAT地址转换
  16. mysql判断题题库_MySQL数据库考试试题及答案
  17. im即时通讯消息id的设计
  18. android debug set screen rotation
  19. live555服务器性能,使用Live555 HTTP容量作为信号服务器
  20. 软工系列之--数据流图(DFD图)

热门文章

  1. Javascript核心技术的基础语法
  2. 《聪明的投资者》书中的精髓:普通投资者耍小聪明,用美好的愿望进行交易,结果往往持续亏损,聪明的投资者用完整的系统保护财富,获得持续收益。
  3. gitlab访问错误Whoops, GitLab is taking too much time to respond搞定
  4. 手机端 html 语音输入,移动端HTML5页面开发备忘录
  5. Numpy(3/3):进阶知识
  6. java十六进制字符串高低位转换
  7. Java使用Graphics2D画波浪线的艰辛之路
  8. 《贫穷不是正义,懦弱亦非善良-雾满拦江》
  9. java泛型类的构造函数_java泛型,泛型类详解
  10. Ubuntu UFW 防火墙配置