问题1:在<bean>标签上如何配置别名?
问题2:Bean的默认作用范围是什么?如何修改?
1. Bean基础配置【重点】
类型 | 描述 |
---|---|
名称 | bean |
类型 | 标签 |
所属 | beans标签 |
功能 | 定义Spring核心容器管理的对象 |
格式 | <beans> <bean/> <bean></bean> </beans> |
属性列表 | id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一 class:bean的类型,即配置的bean的全路径类名 |
<bean id="orderDao" class="cn.zxy.dao.impl.OrderDaoImpl"></bean>
<bean id="orderService" class="cn.zxy.service.impl.OrderServiceImpl">
2. Bean别名配置
类型 | 描述 |
---|---|
名称 | name |
类型 | 属性 |
所属 | bean标签 |
功能 | 定义bean的别名,可定义多个,使用逗号(,)分号( ; ) 空格( )分隔 |
范例 | <bean id="orderDao" class="cn.zxy.dao.impl.OrderDaoImpl"></bean> <bean id="orderService" class="cn.zxy.service.impl.OrderServiceImpl"> |
3 Bean作用范围配置【重点】
类型 | 描述 |
---|---|
名称 | scope |
类型 | 属性 |
所属 | bean标签 |
功能 | 定义bean的作用范围,可选范围: singleton:单例(默认) prototype:非单例 |
范例 | <bean id="bookDao" class="com.by.dao.impl.BookDaoImpl" scope="singleton"></bean> <bean id="bookDao" class="com.by.dao.impl.BookDaoImpl" scope="prototype"></bean> |
扩展:
scope的取值不仅仅只有singleton和prototype,
还有request、session、application、 websocket ,
表示创建出的对象放置在web容器(tomcat)对应的位置。
比如:request表示保存到request域中。
<!-- sope 是bean的作用范围 可选单例singleton 非单例prototype-->
<bean id="bookDao" class="com.by.dao.impl.BookDaoImpl" scope="singleton"></bean>
<bean id="bookDao" class="com.by.dao.impl.BookDaoImpl" scope="prototype"></bean>
@Test
public void springdemo01(){
//演示单例 非单例
ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml");
BookDao bookDao=(BookDao)ac.getBean("bookDao");
BookDao bookDao2=(BookDao)ac.getBean("bookDao");
System.out.println(bookDao);
System.out.println(bookDao2);
}
非单例打印结果
最后给大家说明一下:在我们的实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。
4. Bean的实例化
Bean的实例化方式有几种?
4.1 Bean是如何创建的【理解】
bean本质上就是对象,创建bean使用构造方法完成
4.2 实例化Bean的三种方式
4.2.1 构造方法方式【重点】
-
BookDaoImpl实现类
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("book dao 构造运行中。。。。");
}
@Override
public void save() {
System.out.println("book dao save....");
}
}
-
applicationContext.xml配置
<!--方式一:构造方法实例化bean-->
<bean id="bookDao" class="com.by.dao.impl.BookDaoImpl"/>
-
AppForInstanceBook测试类
public class AppForInstanceBook {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
==注意:无参构造方法如果不存在,将抛出异常BeanCreationException==
4.2.2 静态工厂方式
-
OrderDao接口和OrderDaoImpl实现类
public interface OrderDao {
public void save();
}
public class OrderDaoImpl implements OrderDao {
public void save() {
System.out.println("order dao save ...");
}
}
-
OrderDaoFactory工厂类
//静态工厂创建对象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("工厂类创建中。。。");
return new OrderDaoImpl();
}
}
-
applicationContext.xml配置
<!--方式二:使用静态工厂实例化bean-->
<bean id="orderDao" class="com.by.factory.OrderDaoFactory" factory-method="getOrderDao"/>
-
AppForInstanceOrder测试类
public class AppForInstanceOrder {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
orderDao.save();
}
}
4.2.3 实例工厂方式
-
UserDao接口和UserDaoImpl实现类
public interface UserDao {
public void save();
}
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("user dao save ...");
}
}
-
UserDaoFactory工厂类
//实例工厂创建对象
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
-
applicationContext.xml配置
<!--方式三:使用实例工厂实例化bean-->
<bean id="userFactoy" class="com.by.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactoy"/>
-
AppForInstanceUser测试类
public class AppForInstanceUser {
public static void main(String[] args) {
// //创建实例工厂对象
// UserDaoFactory userDaoFactory = new UserDaoFactory();
// //通过实例工厂对象创建对象
// UserDao userDao = userDaoFactory.getUserDao();
// userDao.save();
ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml");
UserDao userDao = (UserDao)ac.getBean("userDao");
userDao.save();
}
}
4.2.4 实现FactoryBean<T>方式【扩展,了解】
-
定义UserDaoFactoryBean实现FactoryBean<UserDao>
UserDaoFactoryBean中实例化什么类型的对象泛型就是该类型。
//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}
-
applicationContext.xml配置
<!--方式四:使用FactoryBean实例化bean-->
<bean id="userDao" class="com.by.factory.UserDaoFactoryBean"/>
使用之前的AppForInstanceUser测试类去运行看结果就行了。注意配置文件中id="userDao"是否重复。