文章目录
Spring学习笔记
依赖注入方式:
引导内容:
setter注入-引用:
即配置文件中:
单个注入:
配置文件:
在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方法。然后调用。
运行结果:
多个注入:
即类似于的那个注入需要几个就添加几个。
运行结果:
setter注入-简单类型:
在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();
}
}
bookService实现类
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"/>
<!-- 此时name指的是构造方法中的形参 ref还是和原来一样表示bookDao Bean-->
</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锁定值对应构造方法中的第几个参数。
三种方法依照情况而定,各有各的优点与缺点。
注入方式选择:
依赖注入方式选择
- 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
- 可选依赖使用setter注入进行,灵活性强
- Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
- 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
- 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
- 自己开发的模块推荐使用setter注入
依赖自动注入:
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式:
按类型( 常用 )
按名称
按构造方法
不启用自动装配
按类型:
set方法与属性依然需要提供。
替换之前的 标签按类型自动填入。类型必须唯一
例如:
它已经报错了,所以唯一很重要。
运行结果:
按名称:
这两个名字需要对应。
注:自动装配不能用于基本数据类型的注入。
Collection注入:
定义属性并提供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>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<property name="list">
<list>
<value>WGQ</value>
<value>ZQJ</value>
<value>WW</value>
</list>
</property>
<property name="set">
<set>
<value>WGQ</value>
<value>WGQ</value>
<value>ZQJ</value>
</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">WGQ</prop>
<prop key="woman">ZQJ</prop>
</props>
</property>
</bean>
运行结果: