目录
前言:
一、前置工作
二、实例化运行
1.构造方法实例化bean
2.使用静态方法实例化bean
3.使用实例化工厂实例化bean
4.使用FactoryBean实例化bean
总结
这里是我对视频学习做的笔记,仅供学习
首先,要创建几个接口和实现的类,类似这样
我这里把大致的代码给一下,有兴趣的可以试试
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中添加依赖
org.springframework
spring-context
5.2.12.RELEASE
这里我用的算是比较新的版本,可以根据个人情况使用
在resources创建applicationContext.xml,这个文件名没有强制要求
选Spring Config
之后就是第二步
上面给过要用的文件,我这里就不写了
配置xml
运行类:
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进行修改了
大致是
没有进行使用其他类内方法,可以不写上面的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();
}
}
运行结果:
创建静态获取
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就行以下配置
最后的运行类基本和第一种一样
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();
}
}
运行:
创建实例化工厂
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配置
这里对于工厂类的位置配置和方法配置
之后就可以写运行类了
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,就是那个有方法的
运行:
严格来说,第四种是第三种的延伸
创建类
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 {
// 方式四:代替原始实例工厂中创建的方法
public OrderDao getObject() throws Exception {
return new OrderDaoimpl();
}
public Class> getObjectType() {
return OrderDao.class;
}
//控制是否单例
public boolean isSingleton() {
return false;
}
}
这里要提的一点,三个方法都可以通过实现Factory重写,进行简单的修改就是上面这个样子
现在只需配置一行,对xml配置:
运行类的话,还是一样的套路
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
老师讲的非常好。