2017年9月17日00:45,写个笔记
setter,构造,注解,三种依赖方式的总结
setter依赖注入总结:
先写个测试类
package Spring05;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Maintest {
UserServlet userServlet;
@Before
public void loadSpringContext(){
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("Application-DI.xml");
System.out.println(applicationContext);
userServlet=(UserServlet) applicationContext.getBean("userServlet");
System.out.println(userServlet);
}
@Test
public void save(){
userServlet.save();
}
}
1,先写一个接口类Dao.
package Spring05;
public interface Dao {
public void save();
public void delete();
}
2.再写两个实现类:UserDao;DepartDao;
UserDao:
package Spring05;
public class UserDao implements Dao {
public void save() {
System.out.println("保存用户......");
}
public void delete() {
System.out.println("删除用户......");
}
}
DepartDao:
package Spring05;
public class DepartDao implements Dao {
public void save() {
System.out.println("保存科室......");
}
public void delete() {
System.out.println("删除科室......");
}
}
3,再写一个模拟servlet类;
package Spring05;
public class UserServlet {
private Dao dao;
public void setDao(Dao dao) {
this.dao = dao;
}
public void save(){
dao.save();
}
public void delete(){
dao.delete();
}
}
4,配置application-DI;
<bean name="UserServlet" class="Spring05.UserServlet">//这一步是把UserServlet交给servlet容器管理
<property name="dao" ref="DepartDao"></property> //这一步等于是给servlet里面的Dao dao新建一个对象,这个对象具体实现的是
ref="DepartDao",也就是实现的DepartDao里面的方法,说白了,就跟Dao dao=new DepartDao();是一样的ref="DepartDao"就是new DepartDao(),如果
ref="UserDao",也就是new UserDao()
</bean><bean name="UserDao" class="Spring05.UserDao"></bean>//这一步是把UserServlet交给servlet容器管理,也就是准备被上面的UserServlet引用;
<bean name="DepartDao" class="Spring05.DepartDao"></bean>
构造依赖注入总结:
构造基本跟setter是一样的,就吧UserServlet里面的set方法换成有参构造方法,然后application-DI里面的
<property name="dao" ref="DepartDao"></property> 换成<constructor-arg index="0" ref="UserDao"></constructor-arg>即可
注解依赖:
注解依赖不需要配置很复杂的把Bean交给Spring容器管理,只需要在application.xml里配置自动注解
<!-- 注解 -->
<!-- 自动扫描Spring05下面的包 ,被扫描的包里面如果想让哪个类里被扫描到需要在类前面加上@commponent
<context:component-scan base-package="Spring05"/>
<!-- -->
<context:annotation-config/>
</beans>
然后在几个需要实依赖关系的类里面都加上@commponent注解这样就是吧bean交给了Spring容器管理了,
然后在UserServlet里的属性前面加上@Resource//这个就跟set依赖注入里application需要交个Spring容器的时候配置的属性是一样的,这个就是自动当做属性配置进去了
然后问题就来了,那么既然是自动注入依赖的,因为UserDao DepartDao都实现的Dao接口,在UserServlet自动依赖dao属性的时候系统不知道依赖谁,会报找
到两个实现类的错误,解决方案就是在这两个的其中一个的注解后面加上("dao")他就是指定的实现类,@Component("dao")
自动注解中@commponent跟 手动配置的 <bean name="UserServlet" class="Spring05.UserServlet">
<bean name="UserDao" class="Spring05.UserDao"></bean>
<bean name="DepartDao" class="Spring05.DepartDao"></bean>是一样的,作用是交给Spring容器管理
@Resource/@Autowired跟 手动配置的
<property name="dao" ref="DepartDao"></property>
<constructor-arg index="0" ref="UserDao"></constructor-arg>是一样的,作用是依赖注入