配置bean的4种情况

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 只有聪明人才能看见的摘要~( ̄▽ ̄~)~

无参构造

首先定义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

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
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相比的一些常见问题。
899 18
什么是EDR?EDR做的比较好的厂商有哪些?
|
边缘计算 安全 网络安全
年度创新产品!阿里云SASE零信任办公平台
从数据中心转向“数据”为中心的安全接入
年度创新产品!阿里云SASE零信任办公平台
|
11月前
|
存储 安全 网络安全
Windows应急响应-QQ巨盗病毒
【10月更文挑战第7天】本文详细介绍了QQ巨盗病毒的危害及其应对措施。该病毒主要通过恶意网站、垃圾邮件等途径传播,窃取QQ账号及密码,并可能进一步泄露隐私信息和破坏系统。文章列举了感染迹象,如系统性能下降和网络异常,并提供了应急响应步骤,包括断网隔离、使用杀毒软件扫描清除病毒、修改密码及开启多重验证等,最后强调了系统恢复与加固以及用户安全教育的重要性。
297 0
|
9月前
|
人工智能 Cloud Native 大数据
DataWorks深度技术解读:构建开放的云原生数据开发平台
Dateworks是一款阿里云推出的云原生数据处理产品,旨在解决数据治理和数仓管理中的挑战。它强调数据的准确性与一致性,确保商业决策的有效性。然而,严格的治理模式限制了开发者的灵活性,尤其是在面对多模态数据和AI应用时。为应对这些挑战,Dateworks进行了重大革新,包括云原生化、开放性增强及面向开发者的改进。通过Kubernetes作为资源底座,Dateworks实现了更灵活的任务调度和容器化支持,连接更多云产品,并提供开源Flowspec和Open API,提升用户体验。
|
12月前
|
前端开发 Java 应用服务中间件
|
机器学习/深度学习 算法 测试技术
【深度学习】手写数字识别Tensorflow2实验报告
文章介绍了使用TensorFlow 2进行手写数字识别的实验报告,包括实验目的、采用全连接神经网络模型进行训练的过程、以及如何使用交叉熵作为损失函数来识别MNIST数据集的手写数字。
369 0
|
XML 设计模式 Java
什么是bean
什么是bean
707 0
|
弹性计算 Cloud Native 数据可视化
99元建站+云服务器?我们认真的!
「云·原生建站 」+「云服务器ECS e实例」套餐低至0.2折,仅需99元/首年!复制链接直达购买页:https://market.aliyun.com/xinxuan/pinpai1
1264 0
99元建站+云服务器?我们认真的!
|
Serverless API 定位技术
快速入门 Edge Function
将你的动态网站或应用程序像静态资源一样部署在全球多台服务器上,始终靠近用户。
快速入门 Edge Function