- 前言
- 一、Spring的优势是什么?
- 二、使用步骤
- 三、Bean标签基本配置
- 四、Bean生命周期配置
- 五、Bean实例化三种方式
- 六、Bean的依赖注入
- 七、Bean的依赖注入方式
- 八、Bean的依赖注入的数据类型
Spring的IOC和DI
一、Spring的优势是什么?1.方便解耦,简化开发
2.AOP编程的支持
3.声明式事务的支持
4.方便程序的测试
5.方便集成各种优秀框架
6.降低JavaEE API的使用难度
1.导入Spring开发的基本包坐标
代码如下(示例):
org.springframework spring-context 5.3.15
2.编写Dao接口和实现类
代码如下(示例):
public interface UserDao {
public void save();
}
public class UserDaoimpl implements UserDao {
@Override
public void save() {
System.out.println("zhangsan");
}
}
3.创建Spring核心配置文件
4.在Spring配置文件中配置UserDaoImpl
5.使用Spring的API获得Bean实例
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}
三、Bean标签基本配置
默认情况下它调用的是类中的无参构造函数。
基本属性:
1.id:Bean的实例的唯一标识
2.class:Bean的完整路径
3.scope属性的取值:
singleton:默认值 单例的
Bean的实例化时机:spring核心文件被加载时
prototype:多例的
Bean的实例化时机:调用getBean()时
init-method:指定类中的初始化方法名称
destroy-method:指定类中的销毁方法名称
public void init() {
System.out.println("初始化方法");
}
public void destroy() {
System.out.println("销毁方法");
}
五、Bean实例化三种方式
1.无参构造函数方法实例化
它会根据默认无参构造方法来创建对象,如果没有则创建失败
2.工厂静态方法实例化
工厂的静态方法返回Bean实例
public class StaticFactory {
public static UserDao getUserDao() {
return new UserDaoimpl();
}
}
3.工厂实例方法实例化
工厂的非静态方法返回Bean实例
public class DynamicFactory {
public UserDao getUserDao() {
return new UserDaoimpl();
}
}
六、Bean的依赖注入
1.创建UserService,UserService内部在调用UserDao的save方法
public interface UserService {
public void save();
}
public class UserServiceimpl implements UserService {
@Override
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}
2.将UserServiceImpl的创建权交给Spring
3.从Spring容器中获得UserService进行操作
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
七、Bean的依赖注入方式
1.构造方法
①创建有参构造函数
public class UserServiceimpl implements UserService {
private UserDao userDao;
public UserServiceimpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
②配置Spring容器调用有参构造函数进行注入
constructor-arg当中的name是构造函数当中的参数名
2.set方法
①在UserServiceImpl中添加setUserDao方法
public class UserServiceimpl implements UserService {
private UserDao userDao;
public UserServiceimpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
②配置Spring容器调用set方法1进行注入
property当中的name是set后面的名字
p命名空间注入的本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中。
首先,需要引入P命名空间
xmlns:p="http://www.springframework.org/schema/p"
其次,修改注入方式
八、Bean的依赖注入的数据类型
以set方法注入。构造函数方法以后补充。也可参考前面
1.普通数据类型
public class UserDaoimpl implements UserDao {
private String userName;
private int age;
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void save() {
System.out.println(userName+"====="+age);
System.out.println("zhangsan");
}
}
2.引用数据类型
public class User {
private String name;
private String addr;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"name='" + name + ''' +
", addr='" + addr + ''' +
'}';
}
}
3.集合数据类型
property当中的name都是该类型所属名字
public class UserDaoimpl implements UserDao {
private List stringList;
private Map userMap;
private Properties properties;
public void setStringList(List stringList) {
this.stringList = stringList;
}
public void setUserMap(Map userMap) {
this.userMap = userMap;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public void save() {
System.out.println(stringList);
System.out.println(userMap);
System.out.println(properties);
System.out.println("zhangsan");
}
}
aaa
bbb
ccc
ppp1
ppp2
ppp3



