spring IOC 创建bean

101 阅读1分钟

bean的创建与依赖的注入

ioc指的是控制反转,即将bean的控制权交给spring。而依赖注入DI则是ioc的具体实现方式。即一个是思想,一个是实现。

1.xml的方式创建bean 并实现依赖注入

1.在xml中定义bean 并设置依赖关系 (即一个bean是另一个bean的proprety)

xml

<bean id="userService" class="service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
</bean>

<bean id="userDao" class="dao.impl.UserDaoImpl">
</bean>

2.在java代码中手动指定set方法

public class UserServiceImpl implements UserService {

    private UserDao userDao;
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

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

2.注解的方式

此时无需xml配置 只需要在被依赖的类上打@component注册成一个bean 然后在需要依赖它的类里 打上@autowired注解 自动注入该bean即可

即 component是创建bean对象的,Autowired是注入依赖的,二者不冲突。一个是创建,一个是注入。

//    <bean id="userDao" class="com.dao.impl.UserDaoImpl"></bean>
//@Component("userDao")
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Value("${jdbc.driver}") // 通过SPEL表达式注入jdbc.properties文件中key的值 即可自动获取val
//    @Value("jam")
    private String name;

    @PostConstruct
    public void init(){
        System.out.println("初始化...");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("销毁...");
    }

    public void save() {
        System.out.println(name);
        System.out.println("saving......");
    }
}
@Service("userService")// 相当于是web层的component
public class UserServiceImpl implements UserService {
//    @Autowired // 只写autowired也能完成注入,会spring容器中找UserDao类型的bean,完成注入
//    @Qualifier("userDao") // 按照bean id从spring容器中进行匹配 但是需要结合@Autowired一起使用
    // 使用xml注入依赖时,必须要set方法;  使用注解的方式注入依赖时,set方法可以省略不写,直接通过反射为userDao赋值

    @Resource(name = "userDao") //相当于@Autowired + @Qualifier 也是根据id进行注入
    private UserDao userDao;

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