bean的四种实例化方法

目录

前言:

一、前置工作

二、实例化运行

1.构造方法实例化bean

 2.使用静态方法实例化bean

 3.使用实例化工厂实例化bean

4.使用FactoryBean实例化bean

总结


前言:

这里是我对视频学习做的笔记,仅供学习


一、前置工作

首先,要创建几个接口和实现的类,类似这样

bean的四种实例化方法_第1张图片

我这里把大致的代码给一下,有兴趣的可以试试

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

之后就是第二步

二、实例化运行

1.构造方法实例化bean

上面给过要用的文件,我这里就不写了

配置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();


    }
}

运行结果:

bean的四种实例化方法_第2张图片

 

简单延伸:使用其他类内方法解耦

将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

简单解释一下联系 (解决其他类内方法引用)

bean的四种实例化方法_第3张图片

 

可以直接使用创建项目(这里我是通过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();

    }
}

运行结果:

bean的四种实例化方法_第4张图片

 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就行以下配置

    

 最后的运行类基本和第一种一样

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();
    }

}

 运行:

bean的四种实例化方法_第5张图片

 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配置



    

这里对于工厂类的位置配置和方法配置

之后就可以写运行类了

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,就是那个有方法的

运行:

bean的四种实例化方法_第6张图片

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 {

//    方式四:代替原始实例工厂中创建的方法
    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();
    }

}

结果:

bean的四种实例化方法_第7张图片


 

 

 

 

总结

刚刚开始学习,可能有很多地方都没有理解到位,努力

大家有兴趣的话,可以去黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术_哔哩哔哩_bilibili

 老师讲的非常好。

你可能感兴趣的:(Maven,java,spring)