ssm框架复习的第五天:spring的DI(依赖注入) 

1.依赖注入的概念

依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。

我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。

ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。

那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。

简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

DI(依赖注入):管理类与类之间的依赖关系

 

2.依赖注入的实现方式

2.1 构造方法注入

通过构造方法给成员属性(变量)赋值

注意:构造方法注入:类中一定要有指定参数的构造方法

name属性中的值一定要是构造函数里面的参数

实现代码如下:

//构造函数UserDao dao
public UserServiceImpl(UserDao dao) {
this.dao = dao;
}

 

<bean id="userService" class="com.swlz.service.impl.UserServiceImpl">
        <constructor-arg name="dao" ref="userDao"></constructor-arg>
    </bean>

2.2 set方法注入

set方法注入在类中一定要有指定的set方法

注意:name属性中的值应该写类属性的名字,而属性的名字由set和get方法决定

代码如下:

private UserDao dao;
 public void setDao(UserDao dao) {
        this.dao = dao;
    }
<bean id="userService1" class="com.swlz.service.impl.UserServiceImpl">
        <property name="dao" ref="userDao"></property>
    </bean>

2.3 注解注入

@Autowired
    private IUserDao userDao;

注意:默认根据(对象)类型进行注入

第一步:根据要注入类型(UserDao)到Spring容器中查找对象,如果根据类型只找到了一个对象,那么直接蒋政对象赋值给属性,如果没有任何这个类型(对象的类型)的对象,就会报错

第二步:如果要注入的类型在Spring容器中找到了多个,根据变量名称去匹配,如果有和变量名称一致致的,直接将这个对象赋值给属性

第三步:如果找到了多个类型的对象,并且没有名称匹配,直接报错

3.p名称空间注入和c名称空间注入

xmlns:p="http://www.springframework.org/schema/p"

xmlns:p="http://www.springframework.org/schema/c"

 4.DI的注解开发

代码如下:

package com.swlz.config;
import org.springframework.context.annotation.*;
@Configuration
//包扫描
@ComponentScan("com.swlz")
//导入配置类
@Import(DataSourceConfig.class)
//jdbc.properties配置文件
@PropertySource("jdbc.properties")
public class ApplicationConfig {

}
package com.swlz.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;
@Configuration
public class DataSourceConfig {

    @Value("${jdbc.driver}")
    private String driverClass;
    @Value("${jdbc.url}")
    private String jdbcUrl;
    @Value("${jdbc.username}")
    private String user;
    @Value("${jdbc.password}")
    private String password;

//创建对象 把这个对象加载到spring的IOC容器中去 交给容器管理  bean相当于配置文件中的bean标签,注解是用来替代配置文件的,简化开发,提高开发效率
   //<bean id="userDao" class="com.swlz.dao.impl.UserDaoImpl"></bean>
    @Bean("dataSource")
    @Scope("singleton")
    public DataSource getDataSource(){
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        try {
            dataSource.setDriverClass(driverClass);
            dataSource.setJdbcUrl(jdbcUrl);
            dataSource.setUser(user);
            dataSource.setPassword(password);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        return dataSource;
    }

    @Bean("template")
    public JdbcTemplate getJdbcTemplate(DataSource dataSource){
        JdbcTemplate template = new JdbcTemplate(dataSource);
        return template;
    }
}
package com.swlz.dao.impl;
import com.swlz.dao.IUserDao;
import com.swlz.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository("userDao")
public class UserDaoImpl implements IUserDao {
    /**
     *  能够完成依赖注入    根据名字取查找指定id的对象注入给这个属性
     *
     *  他是和jdk版本相关的 jdk1.8或者之前都可以使用,但是1.8之后不能使用
     */

    @Autowired
    private JdbcTemplate template;
    /**
     * 从数据库查询所有用户
     * @return
     */
    public List<User> findAll() {

        System.out.println("userDao.... findAll");

        String sql  = "select * from user";
        return template.query(sql,new BeanPropertyRowMapper<User>(User.class));
    }
    /**
     * 保存用户到数据库
     * @param user
     */
    public void saveUser(User user) {
        String sql = "insert into user values(null,?,?,?,?)";
        template.update(sql,user.getName(),user.getAge(),user.getSex(),user.getAddress());
    }
}
package com.swlz.service.impl;

import com.swlz.dao.IUserDao;
import com.swlz.domain.User;
import com.swlz.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private IUserDao userDao;
    public List<User> findAll() {

       return userDao.findAll();
    }

    public void saveUser(User user) {
        userDao.saveUser(user);
    }
}
#JDBC配置文件 jdbc.properties
jdbc.url=jdbc:mysql://localhost:3306/db5
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

今日学习感受:学习的时候总是有些浮躁,这是很不好的,不能静下心来踏实的去学习,这是很不对的。希望自己能及早改正,让自己能够沉下心来,潜心学习,这才是正确之举。当然也要劳逸结合。学习也要把一日三餐吃好,吃饱了吃好了才有的好的精神状态去继续学习。最后一句话:书山有路勤,为径学海无涯苦作舟。