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();
}
输出的结果
