即配置文件中:
在BookService中添加需要依赖的Bean通过ref属性添加。
在BookService中注入BookDao
public class BookServiceImpl implements BookService {
//删除业务层中使用new创建的对象
// private BookDao bookDao=new BookDaoImpl();
private BookDao bookDao;
private UserDao userDao;
/* public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
*/
@Override
public void Save() {
System.out.println("BookService Save");
bookDao.Save();
// userDao.Save();
}
//提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
提供set方法。然后调用。
即类似于的那个注入需要几个就添加几个。
在UserDao中做示例。
package org.wgq.dao.impl;
import org.wgq.UserDao;
public class UserDaoImpl implements UserDao {
private int connectionNum;
private String databaseName;
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public void setConnectionNum(int connectionNum) {
this.connectionNum = connectionNum;
}
@Override
public void Save(){
System.out.println("UserDao Save() Is running"+databaseName+connectionNum);
}
}
两个私有属性,并生成对应的set方法。
<bean id="userDao" class="org.wgq.dao.impl.UserDaoImpl" >
<property name="connectionNum" value="20"/>
<property name="databaseName" value="MySQL"/>
bean>
使用value获取基本类型的值。
package org.wgq;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForDIconstructor {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.Save();
}
}
package org.wgq.service.impl;
import org.wgq.BookDao;
import org.wgq.BookService;
import org.wgq.UserDao;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
//提供BookDao的构造方法
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void Save() {
System.out.println("BookService Save");
bookDao.Save();
}
}
<bean id="bookService" name="service " class="org.wgq.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
bean>
需要修改构造方法:
配置文件修改:
运行结果:
给定属性与构造方法:
修改配置文件:
运行结果:
以上配置为标准书写方式,耦合度较高,比如在构造方法中databaseName变更为database,那么配置文件中则无法应用。
为此Spring给出了解决方法。
去掉name属性,换用type。这样就不用担心形参名字改变了。
type表示数据类型,按数据类型进行对应赋值
<bean id="bookDao" class="org.wgq.dao.impl.BookDaoImpl" >
<constructor-arg type="java.lang.String" value="Redis"/>
<constructor-arg type="int" value="10"/>
bean>
运行结果:
但是万一有相同的数据类型怎么办呢?又乱套了。
对此Spring也给出了解决方法。
配置文件:
使用index锁定值对应构造方法中的第几个参数。
三种方法依照情况而定,各有各的优点与缺点。
依赖注入方式选择
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式:
按类型( 常用 )
按名称
按构造方法
不启用自动装配
set方法与属性依然需要提供。
替换之前的 标签按类型自动填入。类型必须唯一
例如:
它已经报错了,所以唯一很重要。
运行结果:
这两个名字需要对应。
注:自动装配不能用于基本数据类型的注入。
定义属性并提供set方法
public class BookDaoImpl implements BookDao {
private int []arr;
private List<String>list;
private Set<String>set;
private Map<String,String>map;
private Properties properties;
public void setArr(int[] arr) {
this.arr = arr;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void save() {
System.out.println("BookDao Is Save");
System.out.println("遍历数组:"+ Arrays.toString(arr));
System.out.println("遍历list: "+list);
System.out.println("遍历set: "+set);
System.out.println("遍历map: "+map);
System.out.println("遍历Properties: "+properties);
}
}
配置文件:
<bean id="bookDao" class="com.wgq.dao.impl.BookDaoImpl">
<property name="arr">
<array>
<value>100value>
<value>200value>
<value>300value>
array>
property>
<property name="list">
<list>
<value>WGQvalue>
<value>ZQJvalue>
<value>WWvalue>
list>
property>
<property name="set">
<set>
<value>WGQvalue>
<value>WGQvalue>
<value>ZQJvalue>
set>
property>
<property name="map">
<map>
<entry key="man" value="WGQ"/>
<entry key="woman" value="ZQJ"/>
<entry key="gender" value="M"/>
map>
property>
<property name="properties">
<props>
<prop key="man">WGQprop>
<prop key="woman">ZQJprop>
props>
property>
bean>
运行结果: