文章目录
SSM 框架(Spring + SpringMVC + Maven + Springboot + MybatisPlus 从入门到精通 ):(第二篇)Spring
前言:紧接上期,我们继续学习 Spring
Spring
DI:依赖注入
细心的同学会发现,我们上一期的只是把 service 层的对象交给 spring帮我们 new,但是在 serviceimpl中,仍然 new 了 Dao层的对象。
这里我们需要解耦合,该怎么办呢?
使用 DI 依赖注入,上期我们已经把 BookDaoimpl 交给了 Spring
所以这里我们需要干什么呢?通俗来说,是让 Spring 自动把 Dao 层的对象交给 Service 层,这里就需要使用到 DI
第一步:修改配置 Spring 文件
因为我们是把 BookDaoimpl 交给 BookServiceimpl,所以我们在 BookServiceimpl 的 bean 标签里面配置。
<bean id="bookService" class="org.example.service.impl.BookServiceimpl">
<property name="bookDao" ref="bookDao1"></property>
</bean>
applicationContext.xml整体
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1.引入spring坐标-->
<!-- 2.新建spring配置文件-->
<!-- 3.配置beaen -->
<bean id="bookDao1" class="org.example.model.impl.BookDaoimpl"></bean>
<bean id="bookService" class="org.example.service.impl.BookServiceimpl">
<property name="bookDao" ref="bookDao1"></property>
</bean>
</beans>
第二步:修改 Bookserviceimpl
首先我们为 Bookcerviceimpl 中的 bookDao 添加 set 方法,这个方法是由我们的 Spring 调用的。
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
然后,由于我们配置了 Spring 依赖注入,我们不需要自己在 BookServiceimpl 中 new bookDao 的对象了,删除 new 对象的部分。如下:
private BookDao bookDao;
BookServiceimpl 修改后的整体代码:
package org.example.service.impl;
import org.example.model.BookDao;
import org.example.model.impl.BookDaoimpl;
import org.example.service.BookService;
public class BookServiceimpl implements BookService {
private BookDao bookDao;
@Override
public void save() {
System.out.println("book service save...");
bookDao.save();
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
最后运行结果:
这样 new 对象的权力就全部交给 Spring 了,这就是 IOC 和 DI。
bean的使用
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1.引入spring坐标-->
<!-- 2.新建spring配置文件-->
<!-- 3.配置beaen -->
<bean id="bookDao1" class="org.example.model.impl.BookDaoimpl"></bean>
<bean id="bookService" class="org.example.service.impl.BookServiceimpl">
<property name="bookDao" ref="bookDao1"></property>
</bean>
</beans>
这是我们之前配置的 bean 的属性
id: id 是用来实例化对象时获取对象的标识
class:class 是我们需要交给 Spring 对象的具体包位置bean 中的 property 是指我们依赖注入的对象配置
name :是我们需要依赖注入的 Bookservice 中的变量名
ref : 是指我们注入对象的 id
这里扩展几个 bean 中常用的属性
name: 可以取别名,别名中间可以以空格,逗号分隔(可以在name一个标签中取多个别名)
Demo:(我们修改配置文件、Main 如下:)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1.引入spring坐标-->
<!-- 2.新建spring配置文件-->
<!-- 3.配置beaen -->
<bean id="bookDao1" class="org.example.model.impl.BookDaoimpl" ></bean>
<bean id="bookService" class="org.example.service.impl.BookServiceimpl" name="service">
<property name="bookDao" ref="bookDao1"></property>
</bean>
</beans>
package org.example;
import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main2 {
public static void main(String[] args) {
//获取ioc容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
BookService bookService = (BookService) ctx.getBean("service");
bookService.save();
}
}
启动发现可以正常启动
bean 构造对象的方式修改:
默认情况下,bean构造的对象都是单例模式,就是说对于多个对象使用,只会有一个对象实体被 new 出来
测试如下(只需要让main中获取两个service层对象,然后打印两个对象地址,如果一样那就是单例模式):
package org.example;
import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main2 {
public static void main(String[] args) {
//获取ioc容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
BookService bookService = (BookService) ctx.getBean("service");
BookService bookService2 = (BookService) ctx.getBean("service");
System.out.println(bookService);
System.out.println(bookService2);
}
}
这是我本地的打印结果,可以发现是一样的结果
这里就证明了,我们默认情况下,bean去构造对象的时候,都是以单例模式的方式,new 对象
文章评论