IOC与Bean

目录

1、Bean管理(两个操作)

2、Bean管理操作基于xml形式操作

创建对象

注入属性

工厂Bean

Bean的作用域

 singleton和prototype区别

bean自动装配

1、根据属性名称自动注入(autowire="byName")

2、根据属性名称自动注入(autowire="byType")

外部属性文件

1、直接配置数据库信息

2、引入外部属性文件配置数据库连接池


1、Bean管理(两个操作)

(1)spring创建对象

就是创建对象完成后交给spring管理

(2)spring注入属性

之前我们为name需要set等方法,现在spring直接就可以为我们注入,无论他是对象,还是其他类型。

2、Bean管理操作基于xml形式操作

创建对象

就是之前的例子

使用bean标签创建

常用属性

id:和创建名字无关,就是唯一标识,获得这个标签。

class:类全路径(包类路径)查找指定的类

创建对象时默认执行无参构造

注入属性

DI(依赖注入)

是IOC的一种实现,必须在创建对象之后,

第一种使用set方法进行注入

当你在使用propert进行注入的时候,如果没有set方法报错,所以必须要有set方法

 

第二种是用有参构造注入

为了方便理解,我设为两个属性 ,并在xml之中注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "test" class="com.zth.Test">
        <constructor-arg name="name" value="薛之谦" ></constructor-arg>
        <constructor-arg name="age" value="18" ></constructor-arg>
    </bean>
</beans>

 也可以用索引

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "test" class="com.zth.Test">
        <constructor-arg index="0" value="薛之谦" ></constructor-arg>
        <constructor-arg index="1" value="18" ></constructor-arg>
    </bean>
</beans>

还有p命名空间注入(不常用)了解即可

设置null值或者特殊符号

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "test" class="com.zth.Test">
        <constructor-arg name="name" >
            <value><![CDATA[<薛之谦>]]></value>
        </constructor-arg>
        <constructor-arg index="1" >
            <null></null>
        </constructor-arg>
    </bean>
</beans>

 

外部Bean的注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "test" class="com.zth.Test">
        <constructor-arg name="name" >
            <value><![CDATA[<薛之谦>]]></value>
        </constructor-arg>
        <constructor-arg index="1" >
            <null></null>
        </constructor-arg>
    </bean>
    <bean id = "test1" class="com.zth.ReTest">
        <property name="test" ref="test"></property>
    </bean>
</beans>

 执行结果

 内部bean注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "test" class="com.zth.Test">
        <constructor-arg name="name" >
            <value><![CDATA[<薛之谦>]]></value>
        </constructor-arg>
        <constructor-arg index="1" >
            <null></null>
        </constructor-arg>
    </bean>
    <bean id = "test1" class="com.zth.ReTest">
        <property name="test" >
            <bean id="ex" class="com.zth.Test">
                <constructor-arg name="name" >
                    <value><![CDATA[<陆仟>]]></value>
                </constructor-arg>
                <constructor-arg index="1" >
                    <null></null>
                </constructor-arg>

            </bean>
        </property>
    </bean>
</beans>

级联式注入(一定要有get方法)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "test" class="com.zth.Test">
        <property name="name" value="222" ></property>
    </bean>
    <bean id = "test1" class="com.zth.ReTest">
        <property name="test.name" value="222" >
        </property>
    </bean>
</beans>

工厂Bean

普通bean,在配置文件中定义的bean类型就是返回类型

工厂bean,在配置文件中定义bean类型可以和返回类型不一样

1、创建类让这个类作为工厂bean,实现接口FactoryBean

public class MyBean implements FactoryBean<Test> {
    @Override
    public Test getObject() throws Exception {
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

2、实现接口里的方法,在实现的方法中定义返回的bean类型

 

按下面的类型执行可以发现会报错,说是类型不匹配

 

 

修改后正常执行 

Bean的作用域

在Spring里可以设置是对象是单例还是多实例

下面我们做个测试 

所以默认情况下是单例模式

可以更改为多实例scope="prototype"

 此时验证为false也就是多例模式

 singleton和prototype区别

1、 singleton是单例 ,prototype是多例

2、设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象。设置scope值是prototype时候,不是在加载spring 配置文件时候创建对象,在调用getBean方法时候创建多实例对象。

bean自动装配

1、根据指定装配规则(属性名称或者属性类型),Spring自动匹配的属性值进行注入


bean标签属性autowire,配置自动装配
autowire
属性常用两个值:
byName根据属性名称注入,注入值bean的1d值和类属性名称-样
byType根据属性类型注入
 

过程

建立Test

public class Test {
    private ReTest reTest;

    public void setReTest(ReTest reTest) {
        this.reTest = reTest;
    }

    @Override
    public String toString() {
        return "Test{" +
                "reTest=" + reTest +
                '}';
    }
}

 建立Retest

public class ReTest {
    @Override
    public String toString() {
        return "ReTest{}";
    }
}

1、根据属性名称自动注入(autowire="byName")

id必须与属性名保持一致否则无法注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="test" class="com.zth.Test" autowire="byName"></bean>
    <bean id="reTest" class="com.zth.ReTest"></bean>
</beans>

结果

 

2、根据属性名称自动注入(autowire="byType")

根据类型注入,他的id不必保持与属性名一致,但是注入bean只能写一个

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="test" class="com.zth.Test" autowire="byType"></bean>
    <!--根据类型注入,他的id不必保持与属性名一致,但是注入bean只能写一个-->
    <bean id="ceTest" class="com.zth.ReTest"></bean>
</beans>

 

外部属性文件

已连接数据库为例,两种发发

1、直接配置数据库信息

        (1)德鲁伊连接池

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="test" class="com.zth.Test" autowire="byType"></bean>
    <!--根据类型注入,他的id不必保持与属性名一致,但是注入bean只能写一个-->
    <bean id="ceTest" class="com.zth.ReTest"></bean>
    <bean id="data" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value ="com.mysql.jdbc.Driver"></property>
        <property name ="url" value="jdbc:mysql://localhost:3306/userDb"></property>
        <property name="username" value ="root"></property>
        <property name="password" value="root" ></property>
    </bean>
</beans>

2、引入外部属性文件配置数据库连接池

建立jdbc.properties文件

prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root

引入外部jdbc.properties

注意修改xmlns约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean name="test" class="com.zth.Test" autowire="byType"></bean>
<!--根据类型注入,他的id不必保持与属性名一致,但是注入bean只能写一个-->
<bean id="ceTest" class="com.zth.ReTest"></bean>
<!--<bean id="data" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value ="com.mysql.jdbc.Driver"></property>
    <property name ="url" value="jdbc:mysql://localhost:3306/userDb"></property>
    <property name="username" value ="root"></property>
    <property name="password" value="root" ></property>
</bean>-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value ="${prop.driverClass}"></property>
        <property name ="url" value="${prop.url}"></property>
        <property name="username" value ="${prop.userName}"></property>
        <property name="password" value="${prop.password}" ></property>
    </bean>
</beans>

其中${prop.driverClass}就是jdbc.properties的对应的值

至此xml文件讲解完毕,脖子疼,如有错误,还请批评指正。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值