IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring注解开发 -> 正文阅读

[Java知识库]Spring注解开发

Spring注解开发

一、spring原始注解

Spig是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xm配置文件可以简化配置,提高开发效率。

原始注解主要是替代的配置

注解说明
@Component使用在类上用于实例化Bean
@Controller使用在web层类上用于实例化Bean
@Service使用在service层类上用于实例化Bean
@Repository使用在dao层类上用于实例化Bean
@Autowired使用在字段上用于根据类型依赖注入
@Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
@Resource相当于@Autowired+@Qualifier,按照名称进行注入
@Value注入普通属性
@Scope标注Bean的作用范围
@PostConstruct使用在方法上标注该方法是Bean的初始化方法
@PreDestroy使用在方法上标注该方法是Bean的销毁方法

代码对比

文件目录创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vldoppMV-1650644160240)(image/image-20220419105446573.png)]

  1. 创建com.zcl.dao包,在下面创建一个UserDao接口

    package com.zcl.dao;
    
    public interface UserDao {
        public void save();
    }
    
    
  2. dao.impl包下创建UserDaoImpl实现接口类,里面输出save running,后面通过bean注入调用会输出这句话

    package com.zcl.dao.impl;
    
    import com.zcl.dao.UserDao;
    
    public class UserDaoImpl implements UserDao {
        @Override
        public void save() {
            System.out.println("save running");
        }
    }
    
    
  3. 创建com.zcl.service包下创建UserService接口

    package com.zcl.service;
    
    public interface UserService {
        public void save();
    }
    
    
  4. service.impl包下创建UserServiceImpl接口实现类,并创建userDao

    package com.zcl.service.impl;
    
    import com.zcl.dao.UserDao;
    import com.zcl.service.UserService;
    
    public class UserServiceImpl implements UserService {
        public UserDao userDao;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public void save() {
            userDao.save(); // save running
        }
    }
    
    
  5. 配置applicationContext.xml文件注入

    <bean id="userDao" class="com.zcl.dao.impl.UserDaoImpl"></bean>
    
    <bean id="userServie" class="com.zcl.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>
    

    原理就是:创建了UserDaoImplDao的实现类注入到UserServiceImpl的userDao中

    ref:注入引用对象

  6. 创建webs包下的UserControll假的web层

    package com.zcl.webs;
    
    import com.zcl.service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class UserController {
        public static void main(String[] args) {
            ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService bean = app.getBean(UserService.class);
            bean.save(); // save running
        }
    }
    
    

    输出结果为:save running

二、spring注解完成上面的功能(快速入门)

  1. 注释上面写在applicationContext.xml配置文件的bean

    <bean id="userDao" class="com.zcl.dao.impl.UserDaoImpl"></bean>
    
    <bean id="userServie" class="com.zcl.service.impl.UserServiceImpl">
    	<property name="userDao" ref="userDao"></property>
    </bean>
    
  2. 根据开头的注解表完成注解配置

    com.zcl.dao.impl包下的UserDaoImpl实现类上写上如下注解代替

    package com.zcl.dao.impl;
    
    import com.zcl.dao.UserDao;
    import org.springframework.stereotype.Component;
    
    // <bean id="userDao" class="com.zcl.dao.impl.UserDaoImpl"></bean>
    @Component("userDao")
    public class UserDaoImpl implements UserDao {
        @Override
        public void save() {
            System.out.println("save running");
        }
    }
    
    

    com.zcl.service.impl包下的UserServiceImpl实现类使用如下注解完成注入

    package com.zcl.service.impl;
    
    import com.zcl.dao.UserDao;
    import com.zcl.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    // <bean id="userServie" class="com.zcl.service.impl.UserServiceImpl">
    @Component("userServie")
    public class UserServiceImpl implements UserService {
    
        // <property name="userDao" ref="userDao"></property>
        @Autowired()
        @Qualifier("userDao")
        public UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public void save() {
            userDao.save();
        }
    }
    
    
  3. 运行报错,配置组件扫描

    applicationContext.xml配置文件下写上如下扫描配置即可运行成功,效果与上面的一致

    <!--配置注解组件的包扫描-->
    <!--不配置扫描会报以下错误:No qualifying bean of type 'com.zcl.service.UserService' available-->
    <context:component-scan base-package="com.zcl"/>
    

三、原生注解详解

参考前面一的原始注解表格来完成

  1. 将上面二写的注解进行一个替换

    1.1、对于dao层的代码使用如下注解替换

    // 替换前的注解是
    @Component("userDao")
    // 替换之后是
    @Repository("userDao")
    

    1.2、对于service层的注解使用如下注解替换

    //  替换前的注解是
    @Component("userServie")
    // 替换之后是
    @Service("userServie")
    

    1.3、对于在service层注解的注入进行如下替换

    如果通过xml配置文件写的,必须要写set方法,通过注解就不用

    @Service("userServie")
    public class UserServiceImpl implements UserService {
        // <property name="userDao" ref="userDao"></property>
        @Autowired() // 按照数据类型从spring容器中进行匹配的
        // 单独写Autowired()也是可以注入的
        @Qualifier("userDao") // 是按照id名称从容器中进行匹配的,但是注意此处@Qualifier()结合@Autowired()一起使用
        public UserDao userDao;
        // 如果通过xml配置文件写的,必须要写set方法,通过注解就不用
        /*public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }*/
    
        @Override
        public void save() {
            userDao.save();
        }
    }
    

    1.4、可以单独使用@Autowired()完成注入

    按照数据类型从spring容器中进行匹配的

    @Service("userServie")
    public class UserServiceImpl implements UserService {
        // <property name="userDao" ref="userDao"></property>
        @Autowired() // 按照数据类型从spring容器中进行匹配的
        public UserDao userDao;
        @Override
        public void save() {
            userDao.save();
        }
    }
    

    1.5、根据@Qualifier("userDao")按照id完成bean注入,需要配合 @Autowired()一起使用

    如二上面演示的一样

    1.6、使用@Resource(name = "userDao")来替换@Qualifier()结合@Autowired()

    @Service("userServie")
    public class UserServiceImpl implements UserService {
        @Resource(name = "userDao") // 相当于@Qualifier()结合@Autowired()一起使用
        public UserDao userDao;
        @Override
        public void save() {
            userDao.save();
        }
    }
    

    1.7、小结:

    • dao层使用如下注解

      @Repository()
      
    • service层使用如下注解

      @Service()
      
    • 对于注解可以使用如下注解,有三种情况选择

      // 1、单独使用@Autowired()
      @Autowired() // 按照数据类型从spring容器中进行匹配的
      // 2、@Qualifier("userDao")
      @Autowired() // 按照数据类型从spring容器中进行匹配的
      @Qualifier("userDao") // 是按照id名称从容器中进行匹配的,但是注意此处@Qualifier()结合@Autowired()一起使用
      
      // 3、@Resource(name = "userDao")
      @Resource(name = "userDao") // 相当于@Qualifier()结合@Autowired()一起使用
      

二、Spring新注解

对于原始注解还不可以完成的替代xml配置文件,如下面列出的几个问题:就需要使用到新注解来完成了

  1. 非自定义的Bean的配置:
  2. 加载properties文件配置:context:property-placeholder/\
  3. 组件扫描的配置:<context:component-scan base-package=“”/>
  4. 引入其他文件:
1、新注解
新注解说明
@Configuration用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解
@ComponentScan用于指定Spring在初始化容器时要扫描的包。
作用和在Spring的ml配置文件中的
<context:component-scan base-package=“com.itheima”/>
@Bean使用在方法上,标注将该方法的返回值存储到Spring容器中
@PropertySource用于加载properties文件中的配置
@Import用于导入其他配置类
2、使用新注解替代xml配置文件
  1. com.zcl.config包下创建SpringCofiguration类,并使用@Configuration创建核心配置

    package com.zcl.config;
    
    import org.springframework.context.annotation.Configuration;
    
    // 标准改类是Spring的核心配置类
    @Configuration
    public class SpringCofiguration {
    }
    
    
  2. 通过@ComponentScan()注解来完成组件扫描

    package com.zcl.config;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.*;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    
    // 标准改类是Spring的核心配置类
    @Configuration
    <!--配置注解组件的包扫描-->
    @ComponentScan("com.zcl")
    public class SpringCofiguration {
    }
    
  3. 通过@PropertySource()注解来加载外部配置文件

    package com.zcl.config;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.*;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    
    // 标准改类是Spring的核心配置类
    @Configuration
    <!--配置注解组件的包扫描-->
    @ComponentScan("com.zcl")
    // 加载外部配置文件
    @PropertySource("classpath:jdbc.properties")
    public class SpringCofiguration {
        
    }
    
  4. 通过原始注解@Value()来解析容器加载jdbc.properties配置文件

    package com.zcl.config;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.*;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    
    // 标准改类是Spring的核心配置类
    @Configuration
    <!--配置注解组件的包扫描-->
    @ComponentScan("com.zcl")
    // 加载外部配置文件
    @PropertySource("classpath:jdbc.properties")
    public class SpringCofiguration {
        // 注入普通属性【解析Spring容器加载的外部配置文件】
        @Value("${jdbc.Driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        // Spring会将当前方法的返回值以指定名称存储到Spring容器中
        @Bean("dataSource")
        public DataSource getDataSource() throws PropertyVetoException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            // dataSource.setDriverClass("${jdbc.Driver}"); 不可以直接写是字符串,需要通过上面的value注入信息,如下一致
            dataSource.setDriverClass(driver);
            dataSource.setJdbcUrl(url);
            dataSource.setUser(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    }
    
  5. 通过@Import注解导入拆分的配置文件

    1、创建一个com.zcl.config包下的DataSourceConfiguration类,将上面代码可以拆掉的都放进去

    2、导入配置文件

    package com.zcl.config;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    
    // 加载外部配置文件
    @PropertySource("classpath:jdbc.properties")
    public class DataSourceConfiguration {
        // 注入普通属性【解析Spring容器加载的配置文件】
        @Value("${jdbc.Driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        // Spring会将当前方法的返回值以指定名称存储到Spring容器中
        @Bean("dataSource")
        public DataSource getDataSource() throws PropertyVetoException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            // dataSource.setDriverClass("${jdbc.Driver}"); 不可以直接写是字符串,需要通过上面的value注入信息,如下一致
            dataSource.setDriverClass(driver);
            dataSource.setJdbcUrl(url);
            dataSource.setUser(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    }
    
    

    导入上面拆分的DataSourceConfiguration.class

    package com.zcl.config;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.*;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    
    // 标准改类是Spring的核心配置类
    @Configuration
    // 组件扫描
    @ComponentScan("com.zcl")
    // 加载多个配置文件,本类注释部分都是拆分到【DataSourceConfiguration】里面再重新引入
    @Import({DataSourceConfiguration.class})
    public class SpringCofiguration {
    }
    
    
  6. 在测试类里面修改配置文件为对于的配置类

    第一个注释的就是使用原来的配置文件完成的,下面是使用了配置类发方法来代替xml文件

    package com.zcl.webs;
    
    import com.zcl.config.SpringCofiguration;
    import com.zcl.service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class UserController {
        public static void main(String[] args) {
            // ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            ApplicationContext app = new AnnotationConfigApplicationContext(SpringCofiguration.class);
            UserService bean = app.getBean(UserService.class);
            bean.save(); // save running
        }
    }
    
    

    测试运行,没有问题

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:15:04  更:2022-04-24 09:17:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:28:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码