配置bean的4种情况

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 只有聪明人才能看见的摘要~( ̄▽ ̄~)~

无参构造

首先定义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("执行UserServiceImpl无参构造方法");
    }
    public UserServiceImpl(String name) {
        System.out.println("执行UserServiceImpl有参构造方法, name = " + name);
    }
    public void setUserDao(UserDao userDao) {
        System.out.println("自动依赖注入,设置UserDao");
        this.userDao = userDao;
    }
    @Override
    public void afterPropertiesSet() {
        System.out.println("执行InitializingBean的afterPropertiesSet");
    }
    public void init() {
        System.out.println("执行bean标签定义的初始化方法");
    }
    @Override
    public void normalMethod() {
        System.out.println("执行普通业务方法");
    }
    @Override
    public void destroy() {
        System.out.println("执行DisposableBean的destroy");
    }
    public void myDestroy() {
        System.out.println("执行bean标签定义的销毁方法");
    }
}

实例化UserDao的方式:

UserDao userDao = new UserDaoImpl();

以无参构造方法配置bean的方式:

<bean id="userDao" class="com.yt.dao.impl.UserDaoImpl"/>

验证

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
    }

有参构造

实例化UserService的方式:

UserService userService = new UserServiceImpl("yt");

以有参构造方法配置bean的方式:

<bean id="userService"  class="com.yt.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="yt"/>
</bean>

验证

public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("userService"));
        // 输出
        // 执行UserServiceImpl有参构造方法, name = yt
        // com.yt.service.impl.UserServiceImpl@179bb86
    }
依赖注入

IOC控制反转,DI依赖注入,AOP面向切面编程是spring的三大特性。配置bean时想要自动注入bean的属性需要提供:bean要注入的对象对应的setter方法,被注入的bean,property标签。

<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"/>

验证

public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("userService"));
        // 输出
        // 执行UserServiceImpl有参构造方法, name = yt
        // 自动依赖注入,设置UserDao
        // com.yt.service.impl.UserServiceImpl@179bb86
    }
bean标签的属性
<bean id="userService"
          name="aaa,bbb,ccc" // 别名,可起多个,getBean时可使用别名获取
          class="com.yt.service.impl.UserServiceImpl"
          scope="prototype" // 默认单例singleton,非默认原型prototype,即每次获取bean都是不同的实例
          lazy-init="true" //懒加载,只在获取bean时生成bean,默认非懒加载,启动容器就创建bean
          init-method="init" // 指定类里面的一个方法为初始化方法
          destroy-method="myDestroy"> // 指定类里面的一个方法为销毁方法,需要手动关闭容器才可看到执行
    </bean>

实现bean的初始化方法和销毁方法还有一种方式,实现InitializingBean, DisposableBean接口。bean标签指定的方法和实现接口的方法的执行顺序见运行结果

public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("userService"));
        userService.normalMethod();
        //当scope是prototype的时候,对象的生存周期spring就不管了。只有在tomcat或者容器关闭的时候,由tomcat调用
        context.close();
    }
// 输出
// 执行UserServiceImpl无参构造方法
// 执行InitializingBean的afterPropertiesSet
// 执行bean标签定义的初始化方法
// com.yt.service.impl.UserServiceImpl@179bb86
// 执行普通业务方法

静态工厂方法(字太多了,懒得写了)

<bean id="userService1" class="com.yt.factory.MyBeanFactory1" factory-method="getUserService"/>

实例工厂方法

<bean id="myBeanFactory2" class="com.yt.factory.MyBeanFactory2"/>
    <bean id="userService2" factory-bean="myBeanFactory2" factory-method="getUserService" lazy-init="true"/>

综合使用

记得导入坐标,再到mybaits官方文档的入门里面下一个xml配置文件模板,改成自己的,记得删掉mappe标签,因为没写

我还是贴出来

<?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>

当前版本为jdk8

<!--配置数据源-->
    <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>
    <!--配置一个当前时间-->
    <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>
    <!--配置一个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>

验证

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

终于写完了,写个文章真难

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 监控 安全
什么是EDR?EDR做的比较好的厂商有哪些?
SentinelOne作为EDR市场的领导者和新兴XDR技术的先驱,我们经常被问到这意味着什么以及它最终如何有助于实现更好的客户成果。本文旨在澄清关于XDR以及与EDR、SIEM和SOAR相比的一些常见问题。
1283 18
什么是EDR?EDR做的比较好的厂商有哪些?
|
人工智能 自然语言处理 搜索推荐
大模型应用产品「归一妙计」亮相,AI Agent落地广告投放场景
在通用L0级语言模型基础之上,结合领域知识训练出适配各应用场景的专属模型,将成为企业经营的“智慧大脑”。 在广告投放这一企业核心的营销场景中,「营销领域大模型」已成为引领行业变革的关键力量,它将重塑数字营销的内容生产方式、投放工作流、消费模式等等,进一步推动营销生态的发展和进化,让广告主的营销内容更丰富、投放更高效、转化更直观。 近期,归一智能正式发布了AI Agent应用产品「归一妙计」,这是一款基于「利欧归一」营销领域大模型,训练出的适配各媒体平台投放工作流的SEMGPT专属模型,能够为企业提供更加智能、精准和高效的AI广告投手服务。
1481 0
大模型应用产品「归一妙计」亮相,AI Agent落地广告投放场景
|
存储 安全 网络安全
Windows应急响应-QQ巨盗病毒
【10月更文挑战第7天】本文详细介绍了QQ巨盗病毒的危害及其应对措施。该病毒主要通过恶意网站、垃圾邮件等途径传播,窃取QQ账号及密码,并可能进一步泄露隐私信息和破坏系统。文章列举了感染迹象,如系统性能下降和网络异常,并提供了应急响应步骤,包括断网隔离、使用杀毒软件扫描清除病毒、修改密码及开启多重验证等,最后强调了系统恢复与加固以及用户安全教育的重要性。
579 0
|
人工智能 JSON 机器人
[译][AI OpenAI-doc] 延迟优化
本指南涵盖了一系列核心原则,您可以应用这些原则来改善在各种LLM相关用例中的延迟。这些技术来自于与广泛的客户和开发人员在生产应用程序上的合作,因此无论您正在构建什么——从细粒度的工作流程到端到端的聊天机器人,都应该适用!
[译][AI OpenAI-doc] 延迟优化
|
人工智能 Cloud Native 大数据
DataWorks深度技术解读:构建开放的云原生数据开发平台
Dateworks是一款阿里云推出的云原生数据处理产品,旨在解决数据治理和数仓管理中的挑战。它强调数据的准确性与一致性,确保商业决策的有效性。然而,严格的治理模式限制了开发者的灵活性,尤其是在面对多模态数据和AI应用时。为应对这些挑战,Dateworks进行了重大革新,包括云原生化、开放性增强及面向开发者的改进。通过Kubernetes作为资源底座,Dateworks实现了更灵活的任务调度和容器化支持,连接更多云产品,并提供开源Flowspec和Open API,提升用户体验。
|
前端开发 Java 应用服务中间件
|
JSON 文字识别 Linux
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - Docker)
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - Docker)
833 0
|
机器学习/深度学习 算法 测试技术
【深度学习】手写数字识别Tensorflow2实验报告
文章介绍了使用TensorFlow 2进行手写数字识别的实验报告,包括实验目的、采用全连接神经网络模型进行训练的过程、以及如何使用交叉熵作为损失函数来识别MNIST数据集的手写数字。
607 0
|
自然语言处理 算法
强化上下文修剪提升LLM推理能力
强化上下文修剪提升LLM推理能力
285 1