3中注入

2019-02-25  javaweb jsp apache-tomcat Spring MVC          私有

https://blog.csdn.net/qq_35923749/article/details/77159213


1 、构造函数注入(Contructor Injection)
MovieLister就只依赖于我们定义的MovieFinder接口,而不依赖于MovieFinder的实现了。

public class MovieLister {
private MovieFinder finder;
 
public MovieLister(MovieFinder finder) {
this.finder = finder;
}
...
}
 
类似的,我们可以增加一个setter函数来传入创建好的MovieFinder对象,这样同样可以避免在MovieFinder中hard init这个对象。
2 、setter注入
public class MovieLister {
s...
public void setFinder(MovieFinder finder) {
this.finder = finder;
}
}
3、 接口注入
接口注入使用接口来提供setter方法,其实现方式如下。
首先要创建一个注入使用的接口。

public interface InjectFinder {
void injectFinder(MovieFinder finder);
}

之后,我们让MovieLister实现这个接口。

class MovieLister implements InjectFinder {
...
public void injectFinder(MovieFinder finder) {
this.finder = finder;
}
...
}

以上三种注入方式,虽然实现了解耦,但多余了很多代码来实例化MovieFinder,MovieLister和MovieFinder两个类并没有完全解耦,那如果将注入方式交给第三方呢?通过bean的注解,想调用时直接通过注解注入,招之即来挥之即去,这就是IOC的创建的初衷。

 

3)、所以通过注解注入bean,就是实例化依赖类的方式,这也是为什么要将@Service和@Repository放到实现类上面而不是接口类上面,接口只是一个规范,需要各种实现类去实现这个接口,我们要用的就是这些实用类的方法。

三、注入的方式有@Recource和@Autowired
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。

@Resource有两个属性是比较重要的,分别是name和type,spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。@Resource装配顺序

如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
如果指定了name,则从上下文中查找名称(id匹配的bean进行装配,找不到则抛出异常。
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配,如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配。
 

当指定了@service的name值时, 在@Resource中要么不指示,如果指示的话,则要与之相对应。

当没有指定@service的name值是,在@Resource中随意。但是前提是,实现该接口的只有这一个类。

所以,建议是最好在@service和@Resoure中同时指定名称,并且做到一一对应。

如果采用@Autowired来注解,则同样无需指定name属性,若是实现该接口有多个类,则需要通过@Qualifier来做区分

 
文章内容的h2标题锚点: