你写的这个是setter注入,刚才我也翻了一下那本书,的确没讲接口注入。 我写个接口注入的例子你看一下 [code=Jav] //接口 public interface Injectable{ public void inject(Object obj); }//实现类 public class Injection implements Injectable{ public Injection(){} public void inject(Object obj){ System.out.println(obj instanceof Injection); }//测试类 public class InjectionTest{ public static Injection injection = new Injection; public static A a = new A(); //A为另一个不相干的简单类,定义我省略了。 @Test public void test(){ injection.inject(a); } [/code] 其中injection.inject(injection)里的参数值是通过容器注入进去的,所以如果用接口注入的话,实现类必须实现这个接口,并且如果接口太多的话,注入就会特别麻烦。 之前你写的那个setter注入,是把接口注入进去,而不是把具体的接口里的参数注入。不知道这样你懂了没?
注入接口,不叫接口注入。spring默认的是注入接口,就是类要实现接口。 比如: @Component("userService") public class UserService implements Service。 1,如下是注入实现,这样的话要加入cglib.jar。 UserService service = (UserService)context.getBean("userService"); 2,注入接口。 Service serive = (Serive)context.getBean("UserService"); 我的环境:spring3.1.3。
[code=Jav]
package com.springpractise;//定义一个接口GreetingServicepublic interface GreetingService { public void SayGreeting();}package com.springpractise;public class GreetingServiceImp implements GreetingService{ private String greeting; public GreetingServiceImp(){} public GreetingServiceImp(String greeting){ this.greeting=greeting; } public void SayGreeting(){ System.out.println(greeting); } public void setGreeting(String greeting){ this.greeting=greeting; }}[/code]
xml配置如下:
[code=XM]
<?xml version=“1.0″ encoding=“UTF-8″?><!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN”“http://www.springframework.org/dtd/spring-beans.dtd”><beans> <bean id=“GreetingService” <!—接口名–> class=“com.springprcatise.GreetingServiceImp”><!—类名GreetingServiceImp类–> <property name=“greeting”> <!– 该属性名对应GreetingServiceImp类的属性(名称一致) –> <value> hello, cuiyun</value><!– 该属性值将被绑定到GreetingServiceImp类的对应属性(greeting)上 –> </property> </bean></beans>
这也能算接口注入??
[/code]
你的意思是说在 GreetingServiceImp 这个类里再加一行下面的:
[code=Jav]
private GreetingService greetingService;
public void setGreetingService (GreetingService greetingService){
this.greetingService = greetingService;
}
[/code]
你说的是这个?
我身边就有Spring in Action 第二版,没有看到有接口注入这回事儿你能列一下吗?
我比较郁闷是,为什么大家一直在说“Spring 注入方式有三种:接口注入 ……”
哪里有接口注入,网上的那些接口注入不就是 Setter 方法么?肯定是以讹传讹了所以我今天就发这样一个帖子,搞明白到底有没有接口注入,有的话是怎么样的
我写个接口注入的例子你看一下
[code=Jav]
//接口
public interface Injectable{
public void inject(Object obj);
}//实现类
public class Injection implements Injectable{
public Injection(){}
public void inject(Object obj){
System.out.println(obj instanceof Injection);
}//测试类
public class InjectionTest{
public static Injection injection = new Injection;
public static A a = new A(); //A为另一个不相干的简单类,定义我省略了。
@Test
public void test(){
injection.inject(a);
}
[/code]
其中injection.inject(injection)里的参数值是通过容器注入进去的,所以如果用接口注入的话,实现类必须实现这个接口,并且如果接口太多的话,注入就会特别麻烦。
之前你写的那个setter注入,是把接口注入进去,而不是把具体的接口里的参数注入。不知道这样你懂了没?
从代码上看啊,是可以完全不要这个接口的,要了还麻烦假设我们把那个接口去掉,还有把 Injection 类的implements 去掉,这个程序照样能走通
我感觉还是和Setter方法是一样的
我看了一下Spring官方2.5.6 的文档,里面根本就没有提到有接口注入这回事儿,倒是说注入的方法有四种:
Setter(设置器)、构造方法、方法注入(使用factory_bean 或 factory_method)注入、注释注入
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.context = beanFactory;
} static public BeanFactory getContext() {
return context;
}
static public Object getBean(String beanName) {
return context.getBean(beanName);
}
}其中BeanFactoryAware 是spring定义的接口,你实现了它,它在启动时,就会自动给你传context其实个人觉得接口注入不能算是注入的一种方式,因为spring也可以做成抽象类,或者父类来实现此注入方式,那是不是又有抽象类注入,父类注入方式了,还有现在的标注不是也可以实现这样和容器绑定的注入方式,比如spring-jdbc就是用了抽象类注入方式给 JdbcDaoSupport注入 JdbcTemplate,倒是可以把这些归为方法注入,倒也说的过去
比如:
@Component("userService")
public class UserService implements Service。
1,如下是注入实现,这样的话要加入cglib.jar。
UserService service = (UserService)context.getBean("userService");
2,注入接口。
Service serive = (Serive)context.getBean("UserService");
我的环境:spring3.1.3。