1 依赖注入(DI)
依赖注入:在Spring创建对象的同时,为其属性赋值,称之为依赖注入。
1.1 set方法注入
创建对象时,Spring工厂会通过Set方法为对象的属性赋值。
范例:定义一个Bean类型
public class User {
private String name;
private int age;
private double money;
private String hobby;
private Date birthday;
//省略set、get方法、构造方法
}
属性注入
<!-- 依赖注入:使用set方法进行注入 user.setName("") user.setBirthday(new Date())-->
<bean id="user" class="com.ying.pojo.User">
<!-- 简单类型注入(String+基本类型) -->
<property name="name" value="张三"/>
<property name="age" value="10"/>
<property name="hobby" value="打篮球"/>
<property name="money" value="200.22"/>
<!-- 对象类型注入(String+基本类型) -->
<property name="birthday" ref="date"/>
</bean>
<bean id="date" class="java.util.Date">
<property name="year" value="122"/>
</bean>
1.2 构造方法注入
范例:定义一个Bean类型 提供构造方法
public class User {
private String name;
private int age;
private double money;
private String hobby;
private Date birthday;
//省略set、get方法、构造方法
}
构造方法注入
<!-- 依赖注入:使用构造方法进行注入 User user = new User("cxk",30,3000,"打篮球",new Date())-->
<bean id="user1" class="com.ying.pojo.User">
<!-- 通过构造方法名注入 -->
<!-- <constructor-arg name="name" value="李四"/>-->
<!-- <constructor-arg name="age" value="20"/>-->
<!-- <constructor-arg name="money" value="222.22"/>-->
<!-- <constructor-arg name="hobby" value="跳"/>-->
<!-- <constructor-arg name="birthday" ref="date"/>-->
<!-- 通过构造方法的参数类型注入 -->
<!-- <constructor-arg type="java.lang.String" value="王五"/>-->
<!-- <constructor-arg type="int" value="30"/>-->
<!-- <constructor-arg type="double" value="333.33"/>-->
<!-- <constructor-arg type="java.lang.String" value="唱"/>-->
<!-- <constructor-arg type="java.util.Date" ref="date"/>-->
<!-- 通过构造方法的下标注入 -->
<constructor-arg index="0" value="赵六"/>
<constructor-arg index="1" value="60"/>
<constructor-arg index="2" value="444.44"/>
<constructor-arg index="3" value="rap"/>
<constructor-arg index="4" ref="date"/>
</bean>
1.3 复杂类型注入
复杂类型指的是:list、set、map、array、properties等类型
定义复杂Bean类型
public class Person {
private List<User> userList;
private Map<String,String> map;
private Set<String> set;
private String[] arr;
private Properties properties;
//省略set、get方法、构造方法
}
给复杂类型注入属性值
<bean id="person" class="com.ying.pojo.Person">
<property name="userList">
<list>
<bean class="com.ying.pojo.User"></bean>
<bean class="com.ying.pojo.User"></bean>
<bean class="com.ying.pojo.User"></bean>
</list>
</property>
<property name="set">
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
<property name="arr">
<array>
<value>a</value>
<value>b</value>
<value>c</value>
</array>
</property>
<property name="map">
<map>
<entry key="k1" value="v1"></entry>
<entry key="k2" value="v2"></entry>
<entry key="k3" value="v3"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="driver">com.mysql.jdbc.Dirver</prop>
<prop key="url">jdbc:mysql:///java2101</prop>
</props>
</property>
</bean>
1.4 自定义类型的注入
范例:在UserServiceImpl中注入UserDaoImpl类型的属性
public class UserServiceImpl {
private UserDaoImpl userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
public void addUser(){
userDao.addUser();
}
}
<!-- 属性注入演示 -->
<!-- 创建UserDaoImpl对象 -->
<bean id="userDao" class="com.ying.dao.UserDaoImpl"></bean>
<!-- 创建UserServiceImpl对象 -->
<bean id="userService" class="com.ying.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
2 依赖注入案例
Spring整合DBUtils实现JDBC开发
EmpServiceImpl
public class EmpServiceImpl {
private EmpDaoImpl empDao;
public void setEmpDao(EmpDaoImpl empDao) {
this.empDao = empDao;
}
public List<Emp> getAll(){
try {
return empDao.getAll();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
EmpDaoImpl
public class EmpDaoImpl {
private QueryRunner queryRunner;
public EmpDaoImpl(QueryRunner queryRunner) {
this.queryRunner = queryRunner;
}
public List<Emp> getAll() throws SQLException {
return queryRunner.query("select * from emp ",new BeanListHandler<Emp>(Emp.class));
}
}
依赖注入配置
<!-- 使用Spring整合DBUtils工具类 -->
<!-- 创建EmpServiceImpl对象 -->
<bean id="empService" class="com.ying.service.EmpServiceImpl">
<property name="empDao" ref="empDao"/>
</bean>
<!-- 创建EmpDaoImpl对象 -->
<bean id="empDao" class="com.ying.dao.EmpDaoImpl">
<constructor-arg name="queryRunner" ref="queryRunner"></constructor-arg>
</bean>
<!-- 创建QueryRunner对象 -->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource"/>
</bean>
<!-- 创建DruidDataSource对象 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 注入DruidDataSource连接池的配置信息 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///java2101"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- <property name="initialSize" value="40"/>-->
<!-- <property name="maxActive" value="100"/>-->
<!-- <property name="minIdle" value="20"/>-->
<!-- <property name="maxWait" value="600000"/>-->
</bean>
测试
@Test
public void test05(){
//创建Spring容器对象
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
EmpServiceImpl empService = ac.getBean("empService", EmpServiceImpl.class);
List<Emp> empList = empService.getAll();
empList.stream().forEach(System.out::println);
}
3 Spring注解开发
3.1 开启注解扫描
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.ying"/>
3.2 Component 注解
用于替换自建类型组件的 <bean…>标签;可以更快速的声明bean
@Component 注解的含义:创建类的对象,相当于xml中配置的bean标签
- @Controller 针对于控制器层的类的注解
- @Service 针对于业务层的类的注解
- @Repository 针对持久层的类的注解 Dao数据访问层
@Component
//@Service("empService")
//@Controller("empService")
//@Repository("empService")
public class EmpServiceImpl implements EmpService{
}
3.3 Autowired注解 (开发常用 )
主要用于属性注入,Spring
@Autowired 自动装配:将对象属性自动进行注入(类型注入)
@Qualifier(“empDaoImpl1”) 限定要自动注入的bean的id,一般和@Autowired联用
注意:@Autowired先会按照类型注入,如果这个类有多个实例,那么再按照名称注入,
如果有多个实例那么需要使用Qualifier进行指定
@Component
public class EmpServiceImpl implements EmpService{
@Autowired
@Qualifier("empDaoImpl1")
//@Resource(name="empDaoImpl2")
private EmpDao empDao;
public void addEmp(){
empDao.addEmp();
}
}
3.4 Resource注解
主要用于属性注入,jdk
@Resource 自动装配:将对象属性自动进行注入(名称注入)文章来源:https://www.toymoban.com/news/detail-408342.html
注意:默认按照名称进行装配,如果找到指定的名称则直接注入。如果没有找到,那么再按类型称注入,如果有多个实例那么需要使用name属性进行指定文章来源地址https://www.toymoban.com/news/detail-408342.html
@Component//@Controller @Service @Repository
public class EmpServiceImpl implements EmpService{
@Resource(name="empDaoImpl2")
private EmpDao empDao;
public void addEmp(){
empDao.addEmp();
}
}
到了这里,关于Spring 02 -Spring依赖注入+Spring注解开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!