接上个笔记
https://blog.csdn.net/weixin_52003758/article/details/124214494
3、XML注入其他类型属性
1、字面量
(1)NULL值
<property name="name" value="">
<null/>
</property>
(2)属性值包含特殊符号
a.把<>进行转义<, >
b.把带特殊符号内容写到CDATA里
<property name="name">
<value><![CDATA[<<南京>>]]></value>
</property>
2、注入属性-外部bean
(1)创建两个类service类和dao类
(2)在service调用dao里面的方法
<bean id="userService" class="com.company.UserService">
<!--
name : 类里面属性名称
ref : 创建userDao对象bean标签的id值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.company.UserDaoImpl"></bean>
3、注入属性-内部bean
4、注入集合类属性
// Course.java
package com.company;
public class Course {
private String cname;
public void setCname(String cname){
this.cname = cname;
}
}
//Stu.java
package com.company;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Stu {
// 1、数组类型属性
private String[] courses;
// 2、list集合类型属性
private List<String> list;
// 3、map集合类型属性
private Map<String, String> maps;
// 4、set集合类型属性
private Set<String> sets;
// 5、自定义类属性
private List<Course> l_courses;
public void setCourses(String[] courses){
this.courses = courses;
}
public void setList(List<String> list){
this.list = list;
}
public void setMaps(Map<String, String> maps){
this.maps = maps;
}
public void setSets(Set<String> sets){
this.sets = sets;
}
public void setL_courses(List<Course> l_courses) {
this.l_courses = l_courses;
}
}
// bean1.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="stu" class="com.company.Stu">
<!-- 1、数组类型属性 -->
<property name="courses">
<list>
<value>java课程</value>
<value>数据库课程</value>
</list>
</property>
<!-- 2、list类型属性 -->
<property name="list">
<list>
<value>gujia</value>
<value>liujiale</value>
</list>
</property>
<!-- 3、map类型属性 -->
<property name="maps">
<map>
<entry key="Java" value="java"></entry>
<entry key="PHP" value="php"></entry>
</map>
</property>
<!-- 4、set类型属性 -->
<property name="sets">
<set>
<value>Mysql</value>
<value>Redis</value>
</set>
</property>
<!-- 5、注入类型是list集合类型,值是对象 -->
<property name="l_courses">
<list>
<!-- bean里面放实例化的bean的id值 -->
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</bean>
<!-- 创建多个course对象 -->
<bean id="course1" class="com.company.Course">
<property name="cname" value="Spring"></property>
</bean>
<bean id="course2" class="com.company.Course">
<property name="cname" value="Vue"></property>
</bean>
</beans>
1
FactoryBean
1、Spring有两种类型的bean,一种普通的bean,另一种工厂bean(FactoryBean)
2、普通bean:在配置文件中定义bean类型就是返回类型
3、工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂bean,实现接口FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型
//Mybean.java
package com.company;
import org.springframework.beans.factory.FactoryBean;
public class MyBean implements FactoryBean<Course> {
// 定义返回bean
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
// Main.java
package com.company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 返回的是Course类型的,因此需要改动为Course.class
Course mybean = context.getBean("myBean", Course.class);
System.out.println(mybean);
}
}
<!-- Bean1.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="myBean" class="com.company.MyBean"></bean>
</beans>
Bean的作用域
1、在Spring里,设置创建bean实例是单实例还是多实例
2、在Spring里,默认情况下,bean是单实例
3、如何设置单实例还是多实例
(1)在Spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
(2)scope属性值
第一个 默认值 singleton,表示单实例对象,在创建Spring配置文件的时候就已经创建实例对象
第二只 prototype,表示多实例对象。在实例化对象的时候,才进行创建实例对象
Bean生命周期
1、执行无参数构造创建bean实例
2、为bean的属性设置值和对其他bean引用(调用set方法)
3、调用bean的舒适化的方法(需要进行配置初始化的方法)
4、bean可以使用,对象获取bean实例化内容
5、当容器关闭的时候,调用bean的销毁方法(需要自己配置销毁的方法)
<bean id="myBean" class="com.company.MyBean" init_method="初始化函数" destroy-method="销毁函数"></bean>
xml自动装配
(1)根据指定装配裹着(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
<!-- 在Emp类里有一个私有成员:private Dept dept;
实现自动装配
bean标签属性autowrite,配置自动装配
autowrite属性常用两个值:
byName根据属性名称注入:注入bean的id值要和类属性名称一样
byType根据属性类型注入,但是bean里不能同时出现几个同一类型的id,无法确定哪一个bean注入
-->
<bean id="emp" class="com.company.Emp" autowrite="byName">
</bean>
<bean id="dept" class="com.company.Dept"></bean>
Bean外部属性文件
1、直接配置数据库信息
(1)配置德鲁伊连接池
(2)引入德鲁伊连接池依赖jar包:druid.jar
<!-- 直接配置连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <!-- 驱动名称 -->
<property name="url" value="jdbc:mysql://local:3306/myDB"></property> <!-- 数据库链接地址 -->
<property name="username" value=""></property>
<property name="password" value=""></property>
</bean>
2、通过引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties格式文件,写数据库信息
(2)把外部的properties属性文件引入到Spring配置文件中
引入context名称空间
在Spring配置文件中使用标签引入外部属性文件
# jdbc.properties
prop.driverClass = com.mysql.jdbc.Driver
prop.url = jdbc:mysql://local:3306/myDB
prop,userName = root
prop.password = root
<!-- bean.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"
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"
>
<!-- 引入外部的属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置连接池 -->
<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>