依赖注入几种方式

常用的通过set方法注入

<bean id="userDao" class="com.matrix42.dao.UserDao"></bean>

<bean id="userService" class="com.matrix42.service.UserService">
    <property name="userDao" ref="userDao"></property>
</bean>

<bean id="userAction" class="com.matrix42.action.UserAction">
    <property name="userService" ref="userService"></property>
</bean>

内部bean

当创建的对象不被容器其他地方引用的时候,可以这样写;这样写不通用,内部对象只能被使用一次

外部bean是单例内部就是单例,外部bean是多例内部就是多例,里面配置scope不生效

<bean id="userAction" class="com.matric42.UserAction">
    <property name="userService">
        <bean class="com.matrix42.userService">
            <property name="userDao">
                <bean class="com.matrix42.UserDao"></bean>
            </property>
        </bean>
    </property>
</bean>

p 名称空间

在beans里加入p名称空间

xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.matrix42.User" p:id="1000" p:name="Jack"></bean>
#也可以用ref(p:nane-ref)

自动装配(了解)

<bean id="userService" class="com.matrix42.UserService" autowire="byName"></bean>

autowire="byName"根据set方法的名字自动在容器中寻找对应的对象
autowire="byType"根据类型自动在容器中寻找对应的对象,要确保对象唯一否则会报错
在xml头中写xdefault-autowire="byType" 全局自动装配设置
简化配置但是维护麻烦

注解

<context:componet-scan base-package="com.matrix42"></context:componet-scan>
@Componet("userDao")
@Scope("prototype")
//相当于<bean id="userDao" class="...">
public class UserDao{
    public void save(){
        System.out.println("UserDao.save()");
    }
}
public class UserService {

    private UserDao userDao;

    //根据名称去ioc容器找对象,找到后注入当前方法
    @Resource(name = "userDao")
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        userDao.save();
    }
}

可以使用@Repository(),@Service(),@Controller()代替Componet()区分它是MVC三层框架的那一层

持久层 业务逻辑层 控制层

可以使用@Repository等,默认名称是类名,且第一个字母小写

简化

public class UserService {

    //根据名称找,再根据类型找
   @Resource 
   private UserDao userDao;

    public void save() {
        userDao.save();
    }
}

使用代码进行依赖注入

使用容器类AnnotationConfigApplicationContext

构造方法可以是类对象,包名等

配置java类使用@Configuration注解,方法使用@bean

@Configuration
public class Config {

    @Bean
    public User getUser(){
         User u = new User();
         u.setId(1);
         return u;
    }
}
public class UserTest {

    @Test
    public void testUser(){
        //创建容器对象
        //ApplicationContext ac = new FileSystemXmlApplicationContext("src/applicationContext.xml");
        //destory()方法在实现类中才有
      //  FileSystemXmlApplicationContext ac = new FileSystemXmlApplicationContext("src/applicationContext.xml");
        AnnotationConfigApplicationContext ac = new  AnnotationConfigApplicationContext ("com.matrix42.config");

                System.out.println("----------------------");

        User u = ac.getBean(User.class);

        //销毁容器实例
        ac.destroy();
    }

}

配置方式与注解方式比较

  • 配置

    便于维护,配置过多,比较繁琐

  • 注释

    开发方便,简化配置,不利于后期维护,如果修改对象创建,关系处理,需要修改代码