一.依赖注入
依赖注入DI:它是spring框架核心ioc的具体实现。在编写程序时候,通过控制反转,把对象的创建交给spring容器中。ioc的解耦知识降低他们之间的依赖关系,但不会消除,如业务层调用持久层。
二.依赖的方式
2.1 通过set方法
1.set方法的注入:
首先,需要引入p命名空间: xmlns:p="http://www.springframework.org/schema/p"
其次,需要注入方式:
<bean id="userService" class="com.ljf.spring.demo.ioc.service.impl.UserServiceImpl">
<property name="ud" ref="userDaoDemo"></property>
</bean>
2.dao层
package com.ljf.spring.demo.ioc.dao;
public interface UserDao {
//添加数据
public int addUser();
}
package com.ljf.spring.demo.ioc.dao.impl;
import com.ljf.spring.demo.ioc.dao.UserDao;
/**
* @ClassName: UserDaoImpl
* @Description: TODO
* @Author: liujianfu
* @Date: 2021/01/01 19:27:19
* @Version: V1.0
**/
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("无参构造函数...");
}
public int addUser() {
System.out.println("add user success!!!!");
return 0;
}
}
3.service
package com.ljf.spring.demo.ioc.service;
public interface UserService {
//添加数据
public int addUser();
}
package com.ljf.spring.demo.ioc.service.impl;
import com.ljf.spring.demo.ioc.dao.UserDao;
import com.ljf.spring.demo.ioc.service.UserService;
/**
* @ClassName: UserServiceImpl
* @Description: TODO
* @Author: liujianfu
* @Date: 2021/01/03 11:19:57
* @Version: V1.0
**/
public class UserServiceImpl implements UserService {
private UserDao ud;
public void setUd(UserDao ud) {
this.ud = ud;
}
public int addUser() {
return ud.addUser();
}
}
引入命名空间:
配置bean标签调用:
4.调用
2.2 通过构造方法
1.dao层:
package com.ljf.spring.demo.ioc.dao;
public interface UserDao {
//添加数据
public int addUser();
}
package com.ljf.spring.demo.ioc.dao.impl;
import com.ljf.spring.demo.ioc.dao.UserDao;
/**
* @ClassName: UserDaoImpl
* @Description: TODO
* @Author: liujianfu
* @Date: 2021/01/01 19:27:19
* @Version: V1.0
**/
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("无参构造函数...");
}
public int addUser() {
System.out.println("add user success!!!!");
return 0;
}
}
2.service层
package com.ljf.spring.demo.ioc.service;
public interface UserService {
//添加数据
public int addUser();
}
package com.ljf.spring.demo.ioc.service.impl;
import com.ljf.spring.demo.ioc.dao.UserDao;
import com.ljf.spring.demo.ioc.service.UserService;
/**
* @ClassName: UserServiceImpl
* @Description: TODO
* @Author: liujianfu
* @Date: 2021/01/03 11:19:57
* @Version: V1.0
**/
public class UserServiceImpl implements UserService {
private UserDao ud;
//有参数构造函数
public UserServiceImpl(UserDao ud) {
this.ud = ud;
}
//无参构造函数
public UserServiceImpl() {
}
/**
public void setUd(UserDao ud) {
this.ud = ud;
}
**/
public int addUser() {
return ud.addUser();
}
}
3.配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--把对象的创建交给spring来管理-->
<!--userDao的创建 ,这个bean的id可以任意起名, 默认使用构造函数实例化对象
<bean id="userDaoDemo" class="com.ljf.spring.demo.ioc.dao.impl.UserDaoImpl" scope="singleton"></bean>
-->
<!--userDao的创建 ,这个bean的id可以任意起名, 静态工厂方式实例化化对象
<bean id="userDaoDemo" class="com.ljf.spring.demo.ioc.config.StaticFactory" factory-method="getUserDao"></bean>
-->
<!--userDao的创建 ,这个bean的id可以任意起名, 动态工厂实例化对象-
<bean id="factoryDemo" class="com.ljf.spring.demo.ioc.config.DynamicFactory" ></bean>
<bean id="userDaoDemo" factory-bean="factoryDemo" factory-method="getUserDao" ></bean>
-->
<!--userDao的创建 ,这个bean的id可以任userService意起名, 默认使用构造函数实例化对象
<bean id="userDaoDemo" class="com.ljf.spring.demo.ioc.dao.impl.UserDaoImpl" scope="singleton"></bean>
使用set方法实例化方法
<bean id="userService" class="com.ljf.spring.demo.ioc.service.impl.UserServiceImpl">
<property name="ud" ref="userDaoDemo"></property>
</bean>
-->
<bean id="userDaoDemo" class="com.ljf.spring.demo.ioc.dao.impl.UserDaoImpl" scope="singleton"></bean>
<bean id="userService" class="com.ljf.spring.demo.ioc.service.impl.UserServiceImpl">
<constructor-arg name="ud" ref="userDaoDemo"></constructor-arg>
</bean>
</beans>
4.调用: