bean的四种实例化方法

目录

前言:

一、前置工作

二、实例化运行

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中添加依赖

<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

 老师讲的非常好。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篆愁君的烦恼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值