首先创建一个实体类User
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String username;
private Integer age;
private Date birth;
}
以User类为例,展示对实体类中基本数据类型属性进行初始化
<bean id="user" class="cn.kgc.spring.entity.User">
<property name="username" value="jason"></property>
<property name="age" value="24"></property>
<property name="birth" value="2022-7-3"></property>
</bean>
这里有两个点需要注意:
1、初始化对象时,使用property标签,实际在初始化时,会调用类中对应属性的set方法;
2、日期类默认使用格式为:yyyy/MM/dd,如果要使用其他类型则需要自定义数据类型转换器:
public class MyDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date parse = simpleDateFormat.parse(source);
return parse;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
然后在配置文件中托管自定义的数据类型转换器
<bean id="converter" class="cn.kgc.spring.entity.converter.MyDateConverter"></bean>
最后将自定义的数据类型转换器交由数据类型转换器工厂对象进行管理
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="converter"></ref>
</set>
</property>
</bean>
再创建Aoo实体类演示String、List、Set、Map、Properties类型的初始化
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Aoo {
private String[] str;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
}
在配置文件中实现注入
<bean id="aoo" class="cn.kgc.spring.entity.Aoo">
<property name="str">
<array>
<value>jason</value>
<value>lee</value>
<value>lu</value>
</array>
</property>
<property name="list">
<list>
<value>jason</value>
<value>lee</value>
<value>lu</value>
</list>
</property>
<property name="set">
<set>
<value>jason</value>
<value>lee</value>
<value>lu</value>
</set>
</property>
<property name="map">
<map>
<entry key="username" value="root"></entry>
<entry key="password" value="root"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
创建实体类Student
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private String stuName;
private String stuNo;
private Integer age;
private Double score;
}
下面演示四种初始化方法
1、使用构造方法完成对象属性的初始化,初始化属性的个数要和类中的构造方法相匹配
<bean id="student" class="cn.kgc.spring.entity.Student">
<constructor-arg name="stuName" value="jason"></constructor-arg>
<constructor-arg name="stuNo" value="20220001"></constructor-arg>
<constructor-arg name="score" value="80.4"></constructor-arg>
<constructor-arg name="age" value="23"></constructor-arg>
</bean>
2、使用type数据类型完成属性的初始化操作,如有相同的数据类型存在,需要配合index指定属性的索引,索引指代属性在类中的顺序
<bean id="student" class="cn.kgc.spring.entity.Student">
<constructor-arg type="java.lang.String" index="1" value="20220001"></constructor-arg>
<constructor-arg type="java.lang.String" index="0" value="jason"></constructor-arg>
<constructor-arg type="java.lang.Double" value="78.5"></constructor-arg>
<constructor-arg type="java.lang.Integer" value="23"></constructor-arg>
</bean>
3.使用p命名空间完成对象的初始化
作用:简化使用property标签完成初始化的过程,但是依然要求类中要有对应的set方法
首先引入p命名空间
xmlns:p="http://www.springframework.org/schema/p"
<bean id="student" class="cn.kgc.spring.entity.Student" p:stuName="jason" p:stuNo="20220001" p:age="20" p:score="89.9"></bean>
4、使用C命名空间完成对象的初始化,本质是使用有参构造完成初始化
先引入C命名空间
xmlns:c="http://www.springframework.org/schema/c"
<bean id="student" class="cn.kgc.spring.entity.Student" c:age="20" c:score="89.4" c:stuName="jason" c:stuNo="20220001"></bean>
建立实体类Teacher展示属性的自动注入
@Setter
@ToString
public class Teacher {
private Student student;
}
属性类型是自定义类型时 不能在使用value 要使用ref 进行关联 ref的值是 关联bean的id
<bean id="teacher" class="cn.kgc.spring.entity.Teacher">
<property name="student" ref="student" ></property>
</bean>
autowire="byName" 根据实体类中属性名字进行自动注入,根据属性的名字,在spring容器查找哪个bean的id和属性名一致
<bean id="teacher" class="cn.kgc.spring.entity.Teacher" autowire="byName"></bean>
接下来再看Connection实例工厂对象:首先建立ConnectionFactoryBean类
public class ConnectionFactoryBean {
public Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql:///java2215?serverTimezone=UTC", "root", "123456");
return connection;
}
}
在配置文件中写如下代码:
<bean id="connFactory" class="cn.kgc.spring.factory.ConnectionFactoryBean"></bean>
<bean id="connection" factory-method="getConnection" factory-bean="connFactory"></bean>
再创建 ConnectionInterfaceFactoryBean类
/**
* 实现FactoryBean接口的工厂对象
* 泛型 指代工厂对象返回值的类型
*/
public class ConnectionInterfaceFactoryBean implements FactoryBean<Connection> {
@Override
public Connection getObject() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql:///java2215?serverTimezone=UTC", "root", "123456");
return connection;
}
@Override
public Class<?> getObjectType() {
return Connection.class;
}
//设置返回的实例化对象是否为单例的
@Override
public boolean isSingleton() {//返回值是true,表示是单例的bean;返回值是false,表示不是单例的bean
return false;
}
}
在配置文件中书写如下代码:
<bean id="connection" class="cn.kgc.spring.factory.ConnectionInterfaceFactoryBean"></bean>
最后展示Connection静态工厂对象:创建ConnectionStaticFactoryBean类
public class ConnectionStaticFactoryBean {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql:///java2215?serverTimezone=UTC", "root", "123456");
return connection;
}
}
在配置文件中书写如下代码:
<bean id="connection" class="cn.kgc.spring.factory.ConnectionStaticFactoryBean" factory-method="getConnection"></bean>