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