Spring 框架-Bean

Spring 框架-Bean


一、核心架构

​ 1、Spring核心容器:core container

​ 2、AOP思想:Aspects

​ 3、Web开发:Spring Mvc

​ 4、数据访问: Data Access、Data Integration(数据集成)

二、操作

​ 1、xml配置

​ SpringConfig.xml

​ 配置注入对象

​ (name : 别名配置 空格 逗号 分号 scope: prototype=多例 singleton =单例)

​ #默认单例:方便管理, 节省资源

​ #适合给容器管理的: 没有状态的对象(表现层 业务层 数据层 工具)

		#不适合容器管理的: 有状态的对象(Bean对象) --每个对象都不一样

​ (ref :引用类型, value:简单类型) 依赖注入对象名称

#面试题目: bean作用范围: singleton prototype request session application websocket

    <bean id="bookDao" class="com.newhand.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.newhand.service.impl.BookServiceImpl" scope="singleton">
        <property name="bookDao" ref="bookDao" />
    </bean>

​ 2、实例化Bean三种方法

​ 1、 构造方法

<bean id="bookService" class="com.newhand.service.impl.BookServiceImpl">
    <constructor-arg name="bookDao" ref="bookDao"/>
    <constructor-arg name="number" value="20"/>
</bean>
public BookDaoImpl() {
    System.out.println("调用构造参数方法");
}

​ 2、静态工厂

<bean id="bookDao" class="com.newhand.factory.StaticBookFactory" factory-method="getBookDao"/>
public class StaticBookFactory {
    public static BookDao getBookDao() {
        System.out.println("StaticBookFactory dao");
        return new BookDaoImpl();
    }
}

​ 3、实例工厂

<bean id="instanceBookFactory" class="com.newhand.factory.InstanceBookFactory"/>
<bean id="bookDao" factory-bean="instanceBookFactory" factory-method="getBookDao"/>
public class InstanceBookFactory {
    public BookDao getBookDao() {
        System.out.println("BookFactory dao");
        return new BookDaoImpl();
    }
}

​ FactoryBean

<bean id="bookDao" class="com.newhand.factory.MyBeanFactory"/>
public class MyBeanFactory implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        System.out.println("MyBeanFactory BookDao");
        return new BookDaoImpl();
    }
    @Override
    public Class<?> getObjectType() {
        return null;
    }
}

面试题: 如何解决Bean的循环依赖问题?

​ 3、依赖注入方式

​ 1、向一个类传递数据的方式: 普通Setter方法、构造方法

​ 2、依赖注入的类型: 引用类型、简单类型

​ 3、相互组合为4种方法

​ xml构造函数构造三种写法:

​ 1、name 2、type 3、index

<!--    使用Set方法注入-->
    <bean id="bookDao" class="com.newhand.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.newhand.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
        <property name="number" value="10"/>
    </bean>

<!--    使用构造函数注入-->
        <bean id="bookDao" class="com.newhand.dao.impl.BookDaoImpl"/>
        <bean id="bookService" class="com.newhand.service.impl.BookServiceImpl">
            <constructor-arg name="bookDao" ref="bookDao"/>
            <constructor-arg name="number" value="20"/>
        </bean>g name="number" value="20"/>
        </bean>

依赖注入方式选择

1、强制依赖 - 构造器构造 不写就报错

2、可选依赖 - Setter 灵活

3、Spring倡导- 构造器构造

4、有必要两者都用

5、实际开发 Setter

6、自己开发 推荐使用Setter

​ 4、依赖自动装配

​ Ioc容器根据Bean依赖资源等自动查找并注入到Bean种

​ 1、自动装配方式:

​ *按类型(byType) – 保障容器中相同类型的Bean唯一,推荐

​ 按名称(byName-要求名称一致)

​ 按构造方法

​ 不启用自动装配

​ 2、配置项

​ 3、依赖自动装配特征

​ 自动装配优先级低于Setter与构造器注入,与以上两种方式同时出现自动装配配置失效

​ 5、集合注入

public class ResourceServiceImpl implements ResourceService {
    private String[] array;
    private List<String> list;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
    public void setArray(String[] array) {
        this.array = array;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public void setSet(Set<String> set) {
        this.set = set;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    @Override
    public String toString() {
        return "ResourceServiceImpl{" +
                "array=" + Arrays.toString(array) +
                ", list=" + list +
                ", set=" + set +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }
}
<bean id="resourceService" class="com.newhand.service.impl.ResourceServiceImpl">
    		<!--数组-->
            <property name="array">
                <array>
                    <value>array1</value>
                    <value>array2</value>
                    <value>array3</value>
                </array>
            </property>
    		<!--List-->
            <property name="list">
                <list>
                    <value>list1</value>
                    <value>list2</value>
                    <value>list3</value>
                    <value>list4</value>
                </list>
            </property>
    		<!--Set-->
            <property name="set">
                <set>
                    <value>value1</value>
                    <value>value1</value>
                    <value>value1</value>
                    <value>value2</value>
                    <value>value3</value>
                </set>
            </property>
    		<!--Map-->
            <property name="map">
                <map>
                    <entry key="key1" value="value1"/>
                    <entry key="key2" value="value2"/>
                    <entry key="key3" value="value3"/>
                </map>
            </property>
    		<!--Properties-->
            <property name="properties">
                <props>
                    <prop key="proKey1">value1</prop>
                    <prop key="proKey2">value2</prop>
                    <prop key="proKey3">value3</prop>
                </props>
            </property>
</bean>

​ 6、生命周期

​ 从创建到消亡的完整过程

​ Bean的生命周期:从创建到销毁

​ 初始化容器

​ 1、创建对象 2、执行构造方法 3、执行属性注入(set)4、执行Bean初始化方法

​ 使用Bean

​ 1、执行业务操作

​ 关闭/销毁容器

​ 1、执行Bean销毁方法

​ Bean生命周期控制: 在Bean创建后到销毁前的一些事情

​ (1)

public class BookDaoImpl implements BookDao{
	//创建
    public void init(){
        System.out.println("init");
    }
	//销毁
    public void destroy(){
        System.out.println("destroy");
    }
}
<!-- SpringContext.xml   --> 
<bean id="bookDao" name="bookDao" class="com.newhand.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>

​ (2) 实现InitializingBean、DisposableBean接口

​ 实现afterPropertiesSet() destroy()方法

public class BookDaoImpl implements BookDao, InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("init");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("Destroy");
    }
}

​ 7、Spring容器创建与销毁

	//1、创建容器        
	ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");
	//2、销毁容器
	//手工关闭容器
	ctx.close();
	//注册关闭容器
	ctx.registerShutdownHook();	

​ 8、Pom文件

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
    </dependencies>
三、常见报错

​ 1、NoSuchBeanDefinitionException: No bean named ‘bookServsice’ available

​ 解决方案: 检查调用以及注入的对象名称

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java-gang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值