• java Spring框架 XML配置和注解配置的区别


    XML配置

    XML配置bean只需要在ApplicationContext.xml这个文件中配置即可
    在这里插入图片描述

    在这里插入图片描述

    构造器注入

    使用constructor-arg name指的是类里面的变量名,ref指的是相关类的id

    setter注入

    使用property注入数据,name和ref与构造器注入一致,如果你想要注入简单类型(例如int或者String之类的),把ref改为value,想注入什么内容,就修改value的值即可

    XML配置与注解配置的差别

    在这里插入图片描述

    使用注解方式定义bean

    只需要在对应的实现类前面带上 @Component 即可,如下

    @Component
    public class BookServiceImpl implements BookService {
        @Autowired
        private BookDao bookDao;
    
        public void save() {
            System.out.println("book service save...");
            bookDao.save();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • @Component就可以定义一个bean,但是用下面三个定义更加的直观
    • @Controller定义表现层的bean
    • @Service定义业务层的bean
    • @Repository定义数据层的bean(也就是DAO)

    比如上个代码我们定义的是service的bean,那么我们就可以把@Component改为@Service,功能其实差不多,但是这样写更加明了,让别人直接就能看出来我们定义了一个业务层的bean

    注解方式如何搜索到已经定义的bean?

    我们新定义一个配置类SpringConfig,在这个类,我们使用 @ComponentScan 来扫描已经使用注解定义好的bean,代码如下,@Configuration 表明我们这个类是配置类,@ComponentScan括号里面写我们想扫描的包,这里我们扫描com.cumt下面的所有包,只要已经用注解定义好的bean,我们都可以使用

    @Configuration
    @ComponentScan("com.cumt")
    public class SpringConfig {
    }
    
    • 1
    • 2
    • 3
    • 4

    引用类型依赖注入

    注解使用自动装配的方式进行依赖注入,只需要在依赖注入的地方写上 @Autowired 即可实现自动装配,如果有重名的bean,可以使用 @Qualifier 表明你到底要注入哪个依赖,写Qualifier的同时还要写Autowired,如果不写则会报错

    @Autowired
    @Qualifier("依赖的名字")
    
    • 1
    • 2

    简单类型依赖注入

    我们使用@Autowired进行引用类型的依赖注入,但是如果是简单类型,我们使用 @Value,后面带上一个括号,以及里面具体的值,如果是这样的话,为什么不直接给变量值?

    因为如果我们使用@Value的话,里面 可以使用${}占位符 来引用properties文件中的变量

    // 使用注解的方式,我们可以使用占位符,这里的jdbc.driver写在了property里面
    @Value("${jdbc.driver}")
    private String name;
    
    // 简单粗暴的方式
    private String name = "这里就不可以使用占位符";
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如何使用注解引用properties文件?

    在XML中,我们新定义命名空间context使用下面的方法引用了properties文件

    
    <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*:*.properties"/>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    而在注解中,我们只需要在配置类SpringConfig中加入下面这一句话就可以实现

    @Configuration
    @ComponentScan("com.cumt")
    @PropertySource("jdbc.properties")
    public class SpringConfig {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用 @PropertySource(“jdbc.properties”) 注入名为jdbc的这个properties,但是注解也有一个不太方便的问题,注解引用properties不可以使用*通配符,如果你想引入多个properties需要使用数组,例子如下,我们同时引用了三个properties文件

    @Configuration
    @ComponentScan("com.cumt")
    @PropertySource({"jdbc.properties", "jdbc2.properties", "jdbc3.properties"})
    @Import(JdbcConfig.class)
    public class SpringConfig {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如何使用注解配置第三方的bean?

    我们是不可能在第三方文件中写注解的,所以这就需要我们在Config这个配置类中手写代码,例如下面我手写了Druid(德鲁伊)的配置,我们需要在手写的函数前面加上 @Bean 表明这是一个第三方的bean,函数名通常设置为bean的ID,在这个函数中我们手动new了一个Druid的DataSource,设置好驱动名称等再返回这个DataSource。

    @Bean
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("${jdbc.driver}");
        ds.setUrl("${jdbc.url}");
        ds.setUsername("${jdbc.username}");
        ds.setPassword("${jdbc.password}");
        return ds;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用XML配置第三方的bean是这样的

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用注解配置init和destroy

    在init函数之前写 @PostConstruct,意思为在构造之后执行init函数

    同理在destroy函数之前写 @PreDestroy,意思为在销毁之前执行destroy函数

    @PostConstruct
    public void init() {
    	System.out.println("init...");
    }
    @PreDestroy
    public void destroy() {
        System.out.println("destroy...");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注解配置如果有多个Config文件

    我们在最主要的那个Config配置类使用Import导入其他配置,如下,我们使用Import导入了JdbcConfig的配置类,这样我们就可以不用把所有的第三方配置全部塞入SpringConfig这一个文件,实现了分层管理

    @Configuration
    @ComponentScan("com.cumt")
    @PropertySource({"jdbc.properties"})
    @Import(JdbcConfig.class)
    public class SpringConfig {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    通过汇编理解cortex-m3:第0章
    基于SSM框架实现学生管理系统
    ObjectMapper - 实现复杂类型对象反序列化(天坑!)
    Oracle(6) Control File
    Git 分布式版本控制工具03Git常用命令:Git全局设置+本地与远程仓库操作获取Git仓库+标签操作+忽略名单+工作区、暂存区、版本库+分支操作+暂时保存
    【giszz笔记】产品设计标准流程【8】
    四级词汇词根 联想记忆法
    String类、String类常见的构造方法、String类的方法介绍、判断功能的方法、转换功能方法、其他方法、Object类
    VR科普研学基地科普开放日普乐蛙VR体验馆沉浸式体验设备
    【Linux进程篇】进程终章:POSIX信号量&&线程池&&线程安全的单例模式&&自旋锁&&读者写者问题
  • 原文地址:https://blog.csdn.net/qq_44343213/article/details/127710018