Bean的实例化应用

bean本质上就是对象,创建bean使用构造方法完成

Bean的含义是可重复使用的Java组件。所谓组件就是一个由可以自行进行内部管理的一个或几个类所组成、外界不了解其内部信息和运行方式的群体。使用它的对象只能通过接口来操作。

遇到的问题1:

Configuration problem: Bean name 'dao' is already used in this <beans> element

Offending resource: class path resource [application.xml]

出现此问题的解决办法:

原因是在xml文件中,定义的bean的class的属性相同

class: 给bean定义的类型 实现了接口的方法

 ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");

其中的一个class,其实是不用写的,正常引用测试类中的ac属性

1、构造方法的注入

在使用接口的时候,声明一个变量,在另一个类中重写这个接口方法,同时在本类中,对自身进行输出,如果没有无参构造,无法进行输出

public class OrderDao  implements OrderDaoImpl {

    //加上void是没有返回值的,在进行测试的时候,没有输出结果 ,下边的save 方法,为什么可以加上void
/*    public  OrderDao(){
        System.out.println("OrderDao的构造方法已经执行");
    }   */

    public OrderDao() {
    }

    //如果设定的是有值的话,需要无参构造。
    public  OrderDao(int i ){
        System.out.println("OrderDao的构造方法已经执行");
    }
/*    public static void main(String[] args) {
        System.out.println("OrderDao的构造方法已经执行");
    }*/
    @Override
    public void save() {
        System.out.println("orderDao正在执行save方法。。。。");
    }
}

xml文件

  <bean id="OrderDaoImpl" class="com.by.dao.OrderDao"></bean>

测试类

public class SpringTest {
      @Test
      public void test (){
            ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");
            OrderDaoImpl orderDaoImpl =(OrderDaoImpl) ac.getBean("OrderDaoImpl");
            System.out.println(orderDaoImpl);
            orderDaoImpl.save();
      }
}

输出结果:

2、静态工厂类的实现

建立一个工厂类

public class BookFactory {
    //声明接口,返回类
    public static BookImpl getBookImpl() {
        System.out.println("静态工厂类正在执行。。。。。");
        return new BookDao();
    }
}

在application中配置bean文件

  <bean id="BookFactory" class="com.by.BookFactory" factory-method="getBookImpl"/>

在测试方法中进行输出

  @Test
      public  void  test01(){
           ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");
           //这里输入的名字是在bean中写出来的id
          //将这里的工厂类换成接口接受数据
           //BookFactory bookFactory =(BookFactory) ac.getBean("BookFactory");
          //   BookImpl BookImpl =(BookImpl)ac.getBean("BookImpl");
           BookImpl bookImpl = (BookImpl) ac.getBean("BookFactory");
          System.out.println(bookImpl);
          bookImpl.save();

      }

出现的问题

java.lang.ClassCastException: class com.by.dao.BookDao cannot be cast to class com.by.BookFactory (com.by.dao.BookDao and com.by.BookFactory are in unnamed module of loader 'app')

出现此问题的解决方法:

将工厂类的名称换为接口数据即可,引用的还是bean中的id名字

          //这里输入的名字是在bean中写出来的id
          //将这里的工厂类换成接口接受数据
           //BookFactory bookFactory =(BookFactory) ac.getBean("BookFactory");   
           BookImpl bookImpl = (BookImpl) ac.getBean("BookFactory");

输出的结果:

3、实例化工厂

接口:

public interface UserImpl {
    public void save ();
}

类实现这个接口

public class UserDao implements UserImpl {
    @Override
    public void save() {
        System.out.println("UserDao正在执行save方法。。。。。。");
    }
}

进行bean的设置

 <bean id="UserFactory" class="com.by.UserFactory"></bean>
  <!--怎么就突然行了呢-->
  <bean id="UserImpl" factory-bean="UserFactory" factory-method="getUserImpl" class="com.by.dao.UserDao"></bean>

进行测试

    @Test
    public void test02() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");
        UserFactory userFactory = (UserFactory) ac.getBean("UserFactory");
        System.out.println(userFactory);

    userFactory.getUserImpl().save();
    }

输出的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值