欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java~spring-ioc的使用

程序员文章站 2022-07-05 15:37:25
spring ioc的使用 IOC容器在很多框架里都在使用,而在spring里它被应用的最大广泛,在框架层面 上,很多功能都使用了ioc技术,下面我们看一下ioc的使用方法。 1. 把服务注册到ioc容器 2. 使用属性注入反射对应类型的实例 3. 多态情况下,使用名称反射类型的实例 把服务注册到i ......

spring-ioc的使用

ioc容器在很多框架里都在使用,而在spring里它被应用的最大广泛,在框架层面
上,很多功能都使用了ioc技术,下面我们看一下ioc的使用方法。

  1. 把服务注册到ioc容器
  2. 使用属性注入反射对应类型的实例
  3. 多态情况下,使用名称反射类型的实例

把服务注册到ioc容器

  1. @bean注册组件

使用@bean注解进行类型的注册,默认你的ioc容器里类型为bean的返回值,名称为bean所有的方法名,与
你的包名称没有直接关系,如果你的接口有多种实现,在注册时可以使用@bean("lind")这种方式来声明。

  1. @component,@configuration,service,repository注册组件

这几个注解都是在类上面声明的,而@bean是声明在方法上的,这一点要注意,这几个注解一般是指对一个
接口的实现,在实现类上加这些注解,例如,一个数据仓储接口userrepository,它可以有多种数据持久
化的方式,如sqluserrepositoryimpl和mongouserrepositoryimpl,那么在注册时你需要为他们起
一个别名,如@repository("sql-userrepositoryimpl) sqluserrepositoryimpl,默认的名称是
类名,但注意类名首字母为小写

public interface emaillogservice {
  void send(string email, string message);
}

@component()
public class emaillogservicehttpimpl implements emaillogservice {
  private static final logger logger = loggerfactory.getlogger(emaillogservicehttpimpl.class);

  @override
  public void send(string email, string message) {
    assert.notnull(email, "email must not be null!");
    logger.info("send email:{},message:{}", email, message);
  }
}
@component("email-socket")
public class emaillogservicesocketimpl implements emaillogservice {
  private static final logger logger = loggerfactory.getlogger(emaillogservicesocketimpl.class);

  @override
  public void send(string email, string message) {
    assert.notnull(email, "email must not be null!");
    logger.info("send email2:{},message:{}", email, message);
  }
}
// 看一下调用时的测试代码
  @resource(name = "email-socket")
  emaillogservice socketemail;
  @autowired
  @qualifier( "emaillogservicehttpimpl")
  emaillogservice httpemail;

  @test
  public void testioc2() {
    socketemail.send("ok", "ok");
  }


  @test
  public void testioc1() {
    httpemail.send("ok", "ok");
  }

在程序中使用bean对象

  1. 使用resource装配bean对象
    在通过别名调用bean时,你可以使用@resource注解来装配对象

  2. 使用@autowired装配bean对象
    也可以使用 @autowired
    @qualifier( "emaillogservicehttpimpl")两个注解去实现程序中的多态

使用场景

在我们有些相同行为而实现方式不同的场景中,如版本1接口与版本2接口,在get方法实现有所不同,而这
两个版本都要同时保留,这时我们需要遵守开闭原则,扩展一个新的接口,而在业务上对代码进行重构,
提取两个版本相同的方法到基类,自己维护各自独有的方法,在为它们的bean起个名字,在装配时,通过
bean的名称进行装配即可。

写个伪代码:

class api_version1(){
@autowired 
@qualifier("print-version1")
printservice printservice;
}

class api_version2(){
@autowired 
@qualifier("print-version2")
printservice printservice;
}

class baseprintservice{}

interface printservice{}

@service("print-version1")
class printserviceimplversion1 extends baseprintservice implements printservice{}

@service("print-version2")
class printserviceimplversion2 extends baseprintservice implements printservice{}

好了,这就是大叔总结的关于spring-ioc的一种东西!