Bean的基础配置

问题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"是否重复。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值