目录
前言:
这里是我对视频学习做的笔记,仅供学习
一、前置工作
首先,要创建几个接口和实现的类,类似这样
我这里把大致的代码给一下,有兴趣的可以试试
package org.example.dao.impl;
import org.example.dao.BookDao;
public class BookDaoImpl implements BookDao {
//反射,通过构造方法获取对象
private BookDaoImpl(){
System.out.println("book dao constructor running ...");
}
public void save() {
System.out.println("book dao save ...");
}
}
package org.example.dao.impl;
import org.example.dao.OrderDao;
public class OrderDaoimpl implements OrderDao {
public void save() {
System.out.println("Order dao ...save");
}
}
package org.example.dao;
public interface BookDao {
public abstract void save();
}
package org.example.dao;
public interface OrderDao {
public void save();
}
package org.example.service.impl;
import org.example.dao.BookDao;
import org.example.dao.impl.BookDaoImpl;
import org.example.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao=new BookDaoImpl() ;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
上面这个可以明显发现new了一个BookDaoImpl,使用了其中的方法
package org.example.service;
public interface BookService {
public abstract void save();
}
还要在pom.xml中添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
这里我用的算是比较新的版本,可以根据个人情况使用
在resources创建applicationContext.xml,这个文件名没有强制要求
选Spring Config
之后就是第二步
二、实例化运行
1.构造方法实例化bean
上面给过要用的文件,我这里就不写了
配置xml
<bean id="bookDao" name="dao dao1 dao2 bookDao2" class="org.example.dao.impl.BookDaoImpl" scope="prototype" />
运行类:
package org.example;
import javafx.application.Application;
import org.example.dao.BookDao;
import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App2 {
public static void main(String[] args) {
// 方式一
//3.获取IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
运行结果:
简单延伸:使用其他类内方法解耦
将BookServiceImpl.java改成下面这个样子(因为我使用了BookDao内的方法)
package org.example.service.impl;
import org.example.dao.BookDao;
import org.example.dao.impl.BookDaoImpl;
import org.example.service.BookService;
public class BookServiceImpl implements BookService {
// 5.删除业务层中使用的new的方式创建的dao对象
private BookDao bookDao;
// private BookDao bookDao=new BookDaoImpl() ;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
// 6.提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
这里就需要对创建的xml进行修改了
大致是
<!-- 2.配置bean-->
<!-- id标识-->
<!-- name别名,可用, ;分隔-->
<!-- class位置-->
<!-- scope范围,有单例(singleton,默认)和多例(prototype)-->
<bean id="bookDao" name="dao dao1 dao2 bookDao2" class="org.example.dao.impl.BookDaoImpl" scope="prototype" />
<!-- <bean id="bookService" class="org.example.service.impl.BookServiceImpl"/>-->
<bean id="bookService" class="org.example.service.impl.BookServiceImpl" scope="singleton">
<!-- 7.配置service与dao的关系-->
<!-- property表示配置当前bean的属性-->
<!-- name表示配置哪一个具体的属性-->
<!-- ref表示参照哪一个bean-->
<property name="bookDao" ref="bookDao"></property>
</bean>
没有进行使用其他类内方法,可以不写上面的property
简单解释一下联系 (解决其他类内方法引用)
可以直接使用创建项目(这里我是通过quickstart模板生成的maven)时自动生成的App.java作为运行类,也可以创建一个新的类作为运行类
大概内容
package org.example;
import javafx.application.Application;
import org.example.dao.BookDao;
import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App2 {
public static void main(String[] args) {
// 方式一
//3.获取IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
BookService bookService = (BookService) ctx.getBean("bookService");
bookDao.save();
System.out.println("=================");
bookService.save();
}
}
运行结果:
2.使用静态方法实例化bean
创建静态获取
package org.example.factory;
import org.example.dao.OrderDao;
import org.example.dao.impl.OrderDaoimpl;
public class OrderDaoFactory {
// 方式二:静态方法
public static OrderDao getOrderDao(){
return new OrderDaoimpl();
}
}
在xml就行以下配置
<bean id="orderDao" class="org.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>
最后的运行类基本和第一种一样
package org.example;
import org.example.dao.OrderDao;
import org.example.factory.OrderDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.annotation.Order;
public class AppForInstanceOrder {
public static void main(String[] args) {
// OrderDao orderDao= OrderDaoFactory.getOrderDao();
// orderDao.save();
//方式二实现
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
orderDao.save();
}
}
运行:
3.使用实例化工厂实例化bean
创建实例化工厂
package org.example.factory;
import org.example.dao.OrderDao;
import org.example.dao.impl.OrderDaoimpl;
public class OrderDaoFactory {
// 方式三:工厂实例化
public OrderDao getorderDao(){
return new OrderDaoimpl();
}
}
和上一种方法几乎上一样,只不过,一个是静态,一个不是
对于xml配置
<bean id="orderFactory" class="org.example.factory.OrderDaoFactory"/>
<bean id="OrderDao" factory-bean="orderFactory" factory-method="getorderDao"/>
这里对于工厂类的位置配置和方法配置
之后就可以写运行类了
package org.example;
import org.example.dao.OrderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceOrder1 {
public static void main(String[] args) {
//方式三
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("OrderDao");
orderDao.save();
}
}
不过需要注意的是,这里不能写工厂的id,要写配置的第二个id,就是那个有方法的
运行:
4.使用FactoryBean实例化bean
严格来说,第四种是第三种的延伸
创建类
package org.example.factory;
import org.example.dao.OrderDao;
import org.example.dao.impl.OrderDaoimpl;
import org.springframework.beans.factory.FactoryBean;
public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {
// 方式四:代替原始实例工厂中创建的方法
public OrderDao getObject() throws Exception {
return new OrderDaoimpl();
}
public Class<?> getObjectType() {
return OrderDao.class;
}
//控制是否单例
public boolean isSingleton() {
return false;
}
}
这里要提的一点,三个方法都可以通过实现Factory重写,进行简单的修改就是上面这个样子
现在只需配置一行,对xml配置:
<bean id="orderdao" class="org.example.factory.OrderDaoFactoryBean"/>
运行类的话,还是一样的套路
package org.example;
import org.example.dao.OrderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceOrder2 {
public static void main(String[] args) {
//方式四实现
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderdao");
orderDao.save();
}
}
结果:
总结
刚刚开始学习,可能有很多地方都没有理解到位,努力
大家有兴趣的话,可以去黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术_哔哩哔哩_bilibili
老师讲的非常好。