1 依賴注入(DI)
依賴注入:在Spring創(chuàng)建對象的同時,為其屬性賦值,稱之為依賴注入。
1.1 set方法注入
創(chuàng)建對象時,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();
}
}
<!-- 屬性注入演示 -->
<!-- 創(chuàng)建UserDaoImpl對象 -->
<bean id="userDao" class="com.ying.dao.UserDaoImpl"></bean>
<!-- 創(chuàng)建UserServiceImpl對象 -->
<bean id="userService" class="com.ying.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
2 依賴注入案例
Spring整合DBUtils實現(xiàn)JDBC開發(fā)
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工具類 -->
<!-- 創(chuàng)建EmpServiceImpl對象 -->
<bean id="empService" class="com.ying.service.EmpServiceImpl">
<property name="empDao" ref="empDao"/>
</bean>
<!-- 創(chuàng)建EmpDaoImpl對象 -->
<bean id="empDao" class="com.ying.dao.EmpDaoImpl">
<constructor-arg name="queryRunner" ref="queryRunner"></constructor-arg>
</bean>
<!-- 創(chuàng)建QueryRunner對象 -->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource"/>
</bean>
<!-- 創(chuàng)建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(){
//創(chuàng)建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注解開發(fā)
3.1 開啟注解掃描
<!-- 開啟注解掃描 -->
<context:component-scan base-package="com.ying"/>
3.2 Component 注解
用于替換自建類型組件的 <bean…>標簽;可以更快速的聲明bean
@Component 注解的含義:創(chuàng)建類的對象,相當于xml中配置的bean標簽
- @Controller 針對于控制器層的類的注解
- @Service 針對于業(yè)務層的類的注解
- @Repository 針對持久層的類的注解 Dao數據訪問層
@Component
//@Service("empService")
//@Controller("empService")
//@Repository("empService")
public class EmpServiceImpl implements EmpService{
}
3.3 Autowired注解 (開發(fā)常用 )
主要用于屬性注入,Spring
@Autowired 自動裝配:將對象屬性自動進行注入(類型注入)
@Qualifier(“empDaoImpl1”) 限定要自動注入的bean的id,一般和@Autowired聯(lián)用
注意:@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 自動裝配:將對象屬性自動進行注入(名稱注入)文章來源:http://www.zghlxwxcb.cn/news/detail-408342.html
注意:默認按照名稱進行裝配,如果找到指定的名稱則直接注入。如果沒有找到,那么再按類型稱注入,如果有多個實例那么需要使用name屬性進行指定文章來源地址http://www.zghlxwxcb.cn/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注解開發(fā)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!