1. Spring DI 详解
什么是DI
依赖注入;说白了,就是给类中的属性赋值操作
几种注入方式
1 构造注入
2 Setter注入
2.1 Value:直接注入的真实的 “值”
2.2 Ref:bean的id,可以说是引用
2.3 数组注入
2.4 List注入
2.5 Map注入
2.6 Set注入
2.7 Null注入
2.8 Properties
public class User { private String name;
private String[] books;
private List<String> courses;
private Map<String,String> cards;
private Set<String> games;
private String wife;
private Properties properties; private Address address;
}
public class Address { private String name;
public void setName(String name) { this.name =name; }
public Address(String name) { super(); this.name =name; }
@Override public String toString() { return "Address [name=" +name + "]"; } } 注意:所有的属性必须有setter方法,要想显示出信息,要加上toString();方法! <beanid="user"class="com.bjsxt.pojo.User"scope="prototype"> <propertyname="name"value="陈冠希"></property> <!-- 数组注入 --> <propertyname="books"> <array> <value>小白书</value> <value>白皮书</value> <value>把妹秘籍</value> </array> </property> <!-- List 注入 --> <propertyname="courses"> <list> <value>java从入门到精通</value> <value>java从精通到精辟</value> </list> </property> <!-- Map注入 --> <propertyname="cards"> <map> <entry> <key><value>ICBC</value></key> <value>工商银行</value> </entry> <entrykey="ABC"> <value>农业银行</value> </entry> </map> </property> <!-- Set 注入 --> <propertyname="games"> <set> <value>王者荣耀</value> <value>LOL</value> <value>dota</value> </set> </property> <!-- 直接赋值为null --> <!-- <property name="wife"><value>null</value></property> --> <!-- null注入 --> <propertyname="wife"><null/></property> <!-- properties 注入 --> <propertyname="properties"> <props> <propkey="driver">com.mysql.jdbc.Driver</prop> <propkey="url">jdbc:mysql://localhost:3306/mybatis</prop> <propkey="username">root</prop> <propkey="password">root</prop> </props> </property> </bean> <!-- ref 注入address --> <propertyname="address"ref="address"></property> |
2. 自动装配
Autowire
Default:默认,跟谁有关系!跟命名空间的default-autowire="default"有关系。
no:不注入。
Byname :按照名称来进行注入,但是,setter方法不能丢!内置还是走的setter方法。 <beanid="userDao"class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean> <beanid="mysql"class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean> <!-- ByName:按照名称来进行注入,名称指的是谁? --> <beanid="userService"class="com.bjsxt.service.impl.UserServiceImpl"autowire="byName"/> |
byType:按照类型注入,如果有多个匹配的话。则会报错,使用时请注意!
错误原因是:
<beanid="userDao"class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean>
<bean id="mysql"class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>
以上两个实现类都属于UserDao,而我们的UserServiceImpl只需要一个!
Constructor:构造注入
public UserServiceImpl(UserDaouserDao) { super(); this.userDao =userDao; } <beanid="userService"class="com.bjsxt.service.impl.UserServiceImpl"autowire="constructor"/>
|
default-autowire:在命名空间下使用,在命名空间下使用作用域是整个的配置文件。对所有的bean对象都起作用!
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="constructor" > 则代表:配置文件中的全局都使用构造器注入! 问题:default-autowire="constructor"和autowire="byName"同时存在的时候。怎么处理? 就近原则! 同时也适用于js,css。 |
3. 总结
Spring:ioc(DI) 依赖注入,控制反转!
注入:就是给对象注入值
控制反转:则就是将对象的生命周期完全交给了spring容器来管理。
Spring-Ioc:为什么能够实现依赖注入,控制反转?原理!
基于反射,工厂。