spring的xml方式配置bean全過程
配置bean的4種情況
無(wú)參構(gòu)造
首先定義UserDao,UserDaoImpl,UserService,UserServiceImpl如下
public interface UserDao {
}
public class UserDaoImpl implements UserDao {
}
public interface UserService {
void normalMethod();
}
public class UserServiceImpl implements UserService, InitializingBean, DisposableBean {
private UserDao userDao;
public UserServiceImpl() {
System.out.println("執(zhí)行UserServiceImpl無(wú)參構(gòu)造方法");
}
public UserServiceImpl(String name) {
System.out.println("執(zhí)行UserServiceImpl有參構(gòu)造方法, name = " + name);
}
public void setUserDao(UserDao userDao) {
System.out.println("自動(dòng)依賴注入,設(shè)置UserDao");
this.userDao = userDao;
}
@Override
public void afterPropertiesSet() {
System.out.println("執(zhí)行InitializingBean的afterPropertiesSet");
}
public void init() {
System.out.println("執(zhí)行bean標(biāo)簽定義的初始化方法");
}
@Override
public void normalMethod() {
System.out.println("執(zhí)行普通業(yè)務(wù)方法");
}
@Override
public void destroy() {
System.out.println("執(zhí)行DisposableBean的destroy");
}
public void myDestroy() {
System.out.println("執(zhí)行bean標(biāo)簽定義的銷毀方法");
}
}
實(shí)例化UserDao的方式:
UserDao userDao = new UserDaoImpl();
以無(wú)參構(gòu)造方法配置bean的方式:
<bean id="userDao" class="com.yt.dao.impl.UserDaoImpl"/>
驗(yàn)證
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
System.out.println(userDao);
// 輸出 com.yt.dao.impl.UserDaoImpl@103f852
}
有參構(gòu)造
實(shí)例化UserService的方式:
UserService userService = new UserServiceImpl("yt");
以有參構(gòu)造方法配置bean的方式:
<bean id="userService" class="com.yt.service.impl.UserServiceImpl">
<constructor-arg name="name" value="yt"/>
</bean>
驗(yàn)證
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("userService"));
// 輸出
// 執(zhí)行UserServiceImpl有參構(gòu)造方法, name = yt
// com.yt.service.impl.UserServiceImpl@179bb86
}
依賴注入
IOC控制反轉(zhuǎn),DI依賴注入,AOP面向切面編程是spring的三大特性。
配置bean時(shí)想要自動(dòng)注入bean的屬性需要提供:bean要注入的對(duì)象對(duì)應(yīng)的setter方法,被注入的bean,property標(biāo)簽。
<bean id="userService" class="com.yt.service.impl.UserServiceImpl">
<constructor-arg name="name" value="yt"/>
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.yt.dao.impl.UserDaoImpl"/>
驗(yàn)證
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("userService"));
// 輸出
// 執(zhí)行UserServiceImpl有參構(gòu)造方法, name = yt
// 自動(dòng)依賴注入,設(shè)置UserDao
// com.yt.service.impl.UserServiceImpl@179bb86
}
bean標(biāo)簽的屬性
<bean id="userService"
name="aaa,bbb,ccc" // 別名,可起多個(gè),getBean時(shí)可使用別名獲取
class="com.yt.service.impl.UserServiceImpl"
scope="prototype" // 默認(rèn)單例singleton,非默認(rèn)原型prototype,即每次獲取bean都是不同的實(shí)例
lazy-init="true" //懶加載,只在獲取bean時(shí)生成bean,默認(rèn)非懶加載,啟動(dòng)容器就創(chuàng)建bean
init-method="init" // 指定類里面的一個(gè)方法為初始化方法
destroy-method="myDestroy"> // 指定類里面的一個(gè)方法為銷毀方法,需要手動(dòng)關(guān)閉容器才可看到執(zhí)行
</bean>
實(shí)現(xiàn)bean的初始化方法和銷毀方法還有一種方式,實(shí)現(xiàn)InitializingBean, DisposableBean接口。bean標(biāo)簽指定的方法和實(shí)現(xiàn)接口的方法的執(zhí)行順序見運(yùn)行結(jié)果
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("userService"));
userService.normalMethod();
//當(dāng)scope是prototype的時(shí)候,對(duì)象的生存周期spring就不管了。只有在tomcat或者容器關(guān)閉的時(shí)候,由tomcat調(diào)用
context.close();
}
// 輸出
// 執(zhí)行UserServiceImpl無(wú)參構(gòu)造方法
// 執(zhí)行InitializingBean的afterPropertiesSet
// 執(zhí)行bean標(biāo)簽定義的初始化方法
// com.yt.service.impl.UserServiceImpl@179bb86
// 執(zhí)行普通業(yè)務(wù)方法
靜態(tài)工廠方法(字太多了,懶得寫了)
<bean id="userService1" class="com.yt.factory.MyBeanFactory1" factory-method="getUserService"/>
實(shí)例工廠方法
<bean id="myBeanFactory2" class="com.yt.factory.MyBeanFactory2"/>
<bean id="userService2" factory-bean="myBeanFactory2" factory-method="getUserService" lazy-init="true"/>
綜合使用
記得導(dǎo)入坐標(biāo),再到mybaits官方文檔的入門里面下一個(gè)xml配置文件模板,改成自己的,記得刪掉mappe標(biāo)簽,因?yàn)闆]寫
我還是貼出來
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
當(dāng)前版本為jdk8
<!--配置數(shù)據(jù)源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--配置Connection-->
<bean id="clazz" class="java.lang.Class" factory-method="forName">
<constructor-arg name="className" value="com.mysql.jdbc.Driver"/>
</bean>
<bean id="connection" class="java.sql.DriverManager" factory-method="getConnection" scope="prototype">
<constructor-arg name="url" value="jdbc:mysql://localhost:3306/bai"/>
<constructor-arg name="user" value="root"/>
<constructor-arg name="password" value="123456"/>
</bean>
<!--配置一個(gè)當(dāng)前時(shí)間-->
<bean id="now" class="java.time.LocalDateTime" factory-method="now"/>
<bean id="dateTimeFormatter" class="java.time.format.DateTimeFormatter" factory-method="ofPattern">
<constructor-arg name="pattern" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
<bean id="nowString" factory-bean="now" factory-method="format">
<constructor-arg name="formatter" ref="dateTimeFormatter"/>
</bean>
<!--配置一個(gè)SqlSessionFactory-->
<bean id="mybatisConfigInputStream" class="org.apache.ibatis.io.Resources" factory-method="getResourceAsStream">
<constructor-arg name="resource" value="mybatis-config.xml"/>
</bean>
<bean id="sqlSessionFactoryBuild" class="org.apache.ibatis.session.SqlSessionFactoryBuilder"/>
<bean id="sqlSessionFactory" factory-bean="sqlSessionFactoryBuild" factory-method="build">
<constructor-arg name="inputStream" ref="mybatisConfigInputStream"/>
</bean>
驗(yàn)證
public class ThirdPartyBeanTest {
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("dataSource"));
System.out.println(context.getBean("connection"));
System.out.println(context.getBean("connection"));
System.out.println(context.getBean("nowString"));
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(is);
System.out.println(sqlSessionFactory);
System.out.println(context.getBean("sqlSessionFactory"));
}
}
// 輸出
{
CreateTime:"2022-11-10 23:53:05",
ActiveCount:0,
PoolingCount:0,
CreateCount:0,
DestroyCount:0,
CloseCount:0,
ConnectCount:0,
Connections:[
]
}
Thu Nov 10 23:53:05 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
com.mysql.jdbc.JDBC4Connection@1af006c
Thu Nov 10 23:53:07 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
com.mysql.jdbc.JDBC4Connection@1d1433e
2022-11-10 23:53:05
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@46293d
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@1997e9d
Process finished with exit code 0
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)Http工具類的封裝操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)Http工具類的封裝操作,涉及java針對(duì)http請(qǐng)求與響應(yīng)、遠(yuǎn)程交互與字符串拼接等操作封裝技巧,需要的朋友可以參考下2018-01-01
java實(shí)現(xiàn)酷狗音樂臨時(shí)緩存文件轉(zhuǎn)換為MP3文件的方法
這篇文章主要介紹了java實(shí)現(xiàn)酷狗音樂臨時(shí)緩存文件轉(zhuǎn)換為MP3文件的方法,涉及java針對(duì)文件操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08
SpringBoot集成Hera實(shí)現(xiàn)分布式應(yīng)用監(jiān)控與追蹤解決方案
Hera是一款由美團(tuán)點(diǎn)評(píng)開源的分布式應(yīng)用監(jiān)控與追蹤系統(tǒng),專注于解決微服務(wù)架構(gòu)下的性能監(jiān)控、故障診斷和鏈路追蹤問題,本文給大家介紹了SpringBoot集成Hera實(shí)現(xiàn)分布式應(yīng)用監(jiān)控與追蹤的解決方案,需要的朋友可以參考下2026-01-01
使用Java生成和識(shí)別二維碼的簡(jiǎn)易教程
在當(dāng)今瞬息萬(wàn)變的商業(yè)和技術(shù)環(huán)境中,二維碼已成為快速、高效信息傳遞的代名詞,本文將為您介紹 Spire.Barcode for Java 這一強(qiáng)大工具,它能幫助您輕松應(yīng)對(duì)Java應(yīng)用程序中的二維碼生成與識(shí)別挑戰(zhàn),需要的朋友可以參考下2025-09-09
Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案
這篇文章主要介紹了Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java不指定長(zhǎng)度的二維數(shù)組實(shí)例
今天小編就為大家分享一篇Java不指定長(zhǎng)度的二維數(shù)組實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07

