目录
1.IOC和DI
(1)IOC(Inversion of Control) 控制反转
产生对象的控制权从调用者本身(程序代码)转移到外部容器(xml配置文件) ,组件之间耦合性降低
(2)DI(Dependency Injection) 依赖注入
在装配对象的时候,将Spring中定义的对象注入到配置文件属性中
(3)IOC与DI的关系
实现IOC思想需要DI做支持
(4)IOC与DI的区别
- IOC 和 DI 两者的本质是一样的,都是为了降低组件和组件间的耦合性
- 描述角度不同
- IOC:组件是如何产生的
- DI:组件是由其他不同的组件所组装起来
2.Spring Bean运用XML文件的几种注入方式
用于下面几种注入方式的公共Bean层,DAO层及Spring配置
User类
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
}
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
}
IUserDao接口类
void insert();
void setUserDao(IUserDao userDao);
MySqlDaoImpl实现类
public void insert() {
System.out.println("往Mysql添加一条记录");
}
OracleDaoImpl实现类
public void insert() {
System.out.println("往Oracle添加一条记录");
}
spring.xml配置文件
如何生成可查看我之前写的[IDEA运用Maven项目搭建Spring]
<!--以下依赖注入后统一由Spring容器管理-->
<!--依赖注入MySqlDao的实现类-->
<bean id="mySqlDao" class="com.cx.dao.impl.MySqlDaoImpl"/>
<!--依赖注入OracleDao的实现类-->
<bean id="oracleDao" class="com.cx.dao.impl.OracleDaoImpl"/>
(1)SET属性注入
①Service层
IUserService接口类
void UserAdd();
UserServiceImpl实现类
/**
* Dao层调用
*/
IUserDao userDao;
/**
* 不添加SET方法的话,Spring配置文件配置完测试时会空指针异常
*
* @param userDao
*/
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
public void UserAdd() {
userDao.insert();
}
②Spring配置文件
<!--SET属性注入方式-->
<bean id="userService" class="com.cx.service.impl.UserServiceImpl">
<property name="userDao" ref="oracleDao"/>
</bean>
③测试
@Test
public void userServiceTest() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
IUserService userService = (IUserService)applicationContext.getBean("userService");
userService.UserAdd();
}
④特点
- 只要修改Spring配置文件中的userService的ref引用,就可以切换不同的Dao层实现类,从而不动源程序代码
(2)构造器注入
①Bean层
注: 一定要有构造方法
②Spring配置文件
<!--构造器注入-->
<bean id="user" class="com.cx.bean.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="username" value="李四"/>
<constructor-arg name="password" value="123"/>
</bean>
③测试
@Test
public void userTest() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
User user = (User)applicationContext.getBean("user");
System.out.println(user);
}
(3)动态工厂注入
①Service层与SET注入方式内容相同
②创建ServiceFactory工厂类来获取UserService实现类
public IUserService getUserService() {
return new UserServiceImpl();
}
③Spring配置文件
<!--动态工厂注入-->
<!--依赖注入ServiceFactory工厂类-->
<bean id="factory" class="com.cx.factory.ServiceFactory"/>
<bean id="userServiceFactory" factory-bean="factory" factory-method="getUserService">
<property name="userDao" ref="oracleDao"/>
</bean>
④测试
@Test
public void userServiceTest2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
IUserService userService = (IUserService)applicationContext.getBean("userServiceFactory");
userService.UserAdd();
}
⑤特点
- 可以根据工厂模式来获取实现类
(4)静态工厂注入
①Service层与SET注入方式内容相同
②创建ServiceStaticFactory工厂类来获取UserService实现类
public static IUserService getUserService() {
return new UserServiceImpl();
}
与动态工厂注入不同,此处添加了static
③Spring配置文件
<!--静态工厂注入-->
<bean id="userServiceStaticFactory" class="com.cx.factory.ServiceStaticFactory" factory-method="getUserService">
<property name="userDao" ref="mySqlDao"/>
</bean>
比动态工厂注入方式少了个bean
④测试
@Test
public void userServiceTest3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
IUserService userService = (IUserService)applicationContext.getBean("userServiceStaticFactory");
userService.UserAdd();
}
(5)c命名空间注入
①在Spring配置文件的Beans中添加
xmlns:c="http://www.springframework.org/schema/c"
②Spring配置文件
<bean id="cUser" class="com.cx.bean.User" c:id="1" c:username="王五" c:password="222"/>
③测试
@Test
public void userTest3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
User user = (User)applicationContext.getBean("cUser");
System.out.println(user);
}
④目的
- 简化构造器注入内容
(6)p命名空间注入
①在Spring配置文件的Beans中添加
xmlns:p="http://www.springframework.org/schema/p"
②Spring配置文件
<bean id="pUser" class="com.cx.bean.User" p:id="2" p:username="赵六" p:password="333"/>
③测试
@Test
public void userTest4() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
User user = (User)applicationContext.getBean("pUser");
System.out.println(user);
}
④目的
- 简化SET属性注入内容