目录
1、根据属性名称自动注入(autowire="byName")
2、根据属性名称自动注入(autowire="byType")
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文件讲解完毕,脖子疼,如有错误,还请批评指正。