博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring DI IOC
阅读量:6650 次
发布时间:2019-06-25

本文共 4170 字,大约阅读时间需要 13 分钟。

hot3.png

作为一名即将毕业的大四学生,虽然我已经在公司实习了4个多月,但是几乎接触不到ssh搭建框架的配置。比如hibernate的一对多,多对多关系啊,还有spring的一些配置。最近准备去参加下面试,在看java面试宝典的时候发现很多基础的配置都忘记了,于是拿出书来复习下。顺便共享下,希望也能帮到正在找工作的同学们哈。话不多说,进入主题。

面试和笔试经常会看到Spring IOC DI AOP的问题下面我们就来解释和实战下这几个东东

IOC(Inversion of Control)控制反转

它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组建的装配和管理。

IOC主要有两种实现的方式

(1)依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方法。

(不懂没用过,从书上抄过来,面试的时候能说下)

(2)依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。

                                                          Inversion of Control

                                                                            |

                                            ______________________________________________

                                            |                                                                    |

                                    Dependency Lookup                                    Dependency Injection

                                                                                                                    |

                                                                                               ————————————————

                                                                                               |                            |                             |

                                                                                   interface Injection       Setter Injection       Constructor Injection

上面的结构图,图字应该打引号,不知道怎么画图的说。大家将就下吧。

下面上代码,设置注入

package com.ioc.test;public interface Person { // 定义Person接口 public void userAxe(); // Person接口里定义一个使用斧头的方法}

package com.ioc.test;public interface Axe { // 定义Axe接口 public String chop(); // Axe接口里面有个砍的方法}

package com.ioc.test;public class Chinese implements Person { // Chinese实现Person接口 private Axe axe; // 面向Axe接口编程,而不是具体的实现类 public Chinese() { // 默认的构造方法 } public void setAxe(Axe axe) { // 设置注入所需要的setXxx()方法  this.axe = axe; } public void userAxe() { // 实现Person接口的userAxe方法  System.out.println(axe.chop()); }}

package com.ioc.test;public class StoneAxe implements Axe { // Axe的一个实现类StoneAxe public StoneAxe() { // 默认构造方法 } public String chop() { // 实现Axe接口的chop()方法  return "石斧砍柴好慢"; }}

 
 
 
  
   
    
 

package com.ioc.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanTest { public static void main(String[] args) {  ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); // 这两个方法要传入的路径不同 bean.xml在src目录下  // ApplicationContext ctx = new FileSystemXmlApplicationContext("src/bean.xml");  Person p = (Person) ctx.getBean("chinese"); // 通过id获得person  p.userAxe(); }}

    上面就是设置注入的代码,运行结果控制台打印出  石斧砍柴好慢 。

在该程序中,我们并没有手动构造任何对象,StoneAxe 和 Chinese 实例都是由BeanFactory构造的,而且它们的依赖关系设置也是有DI容器完成的。我们所做的事情,只是告诉了BeanFactory这些对象间的依赖关系。     

提示:主程序调用Person的userAxe()方法时,该方法需要使用Axe的实例,但程序中并没有将特定的Person实例和Axe实例耦合在一起。或者说,程序里没有为Person实例传入Axe的实例,Axe的实例由Spring在运行期间动态注入。  

构造注入代码

package com.ioc.test;public class Animal { private String name; private int age; public Animal(String name, int age) {  this.name = name;  this.age = age; } public String getName() {  return name; } public void setName(String name) {  this.name = name; } public int getAge() {  return age; } public void setAge(int age) {  this.age = age; }}

 
  
Dog
  
3
 

这样就能getBean("animal")得到com.ioc.test.Animal类。 但是3 和 Dog的顺序不能错,否则报出异常。

我们可以通过按类型匹配传入参数

 
  
Dog
  
3
 

当不确定参数类型而确定参数个数时,可以用索引匹配传入参数

  
Dog
  
3
 

联合使用

  
Dog
  
3
 

提示:设值注入与构造注入的区别在于:设值注入是在需要某一个Bean实例时,创建一个默认的Bean实例,然后调用对应的设值方法注入依赖关系;而构造注入则在创建Bean实例时,已经完成了依赖关系的注入。

关于他们的优缺点:看上面的例子想下把,或者百度一下啦。

属性注入

@Autowired, ,@EJB

前面两个的区别大家去百度吧,EJB没用过

package com.ioc.test;public class Office { private String officeNo = "001"; public String toString() {  return "办公号: " + officeNo; } public String getOfficeNo() {  return officeNo; } public void setOfficeNo(String officeNo) {  this.officeNo = officeNo; }}

package com.ioc.test;import org.springframework.beans.factory.annotation.Autowired;public class Boss { @Autowired private Office office; public String toString() {  return "office--" + office; } public Office getOffice() {  return office; } public void setOffice(Office office) {  this.office = office; }}

 
 
  
  
 
   

在测试类中

   Boss boss = (Boss) ctx.getBean("boss"); // 通过id获得person  System.out.println(boss);

打印结果  : office--办公号: 002

还有方法注入,但是书上说方法注入的使用过于复杂,而且不适用。我们完全可以通过改进应用的架构设计,避免使用它。

作为应届生只知道这么点啦。AOP的例子晚点写上来,希望能帮助到大家。

 

转载于:https://my.oschina.net/u/1444899/blog/215145

你可能感兴趣的文章
嵌入式开发-lesson3-Linux基础命令与简单配置
查看>>
ELK日志处理之使用Grok解析日志
查看>>
SharePoint Server 2016 WEB 网站浏览器支持
查看>>
静态路由实验
查看>>
自我的SSH2实现数据库和界面的分页
查看>>
华为OSPF配置
查看>>
mysql批量结束线程
查看>>
cookie注入
查看>>
python range()内建函数
查看>>
Android常用的一些服务demo源码
查看>>
在32位redhat5上安装Oracle10gR2步骤
查看>>
基于KVM的NOVA开启suse10虚机配置文件
查看>>
Discuz!帮助站点
查看>>
centos6.5 设置固定ip
查看>>
hadoop shell
查看>>
TFRecord 的使用
查看>>
BOX-虚拟桌面(MCS、PVS、Composer区别)
查看>>
设计模式之11个行为型模式
查看>>
在Digital Ocean上的MongoDB
查看>>
用oracle的java存储过程实现BLOB字段的字符串读取
查看>>