当前位置: 首页 > news >正文

Spring常用的注解有哪些?作用是什么?怎么用?

一、怎么用?

       首先需要在bean.xml文件中配置注解组件扫描,只有配置了组件扫描,spring才会去指定包下面扫描你使用了哪些注解,并让其生效。例如:

    <!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效-->
    <context:component-scan base-package="com.frank"></context:component-scan>

       其次,依据注解的使用方法,在类或者方法的头上标记注解。

二、有哪些以及它的作用是什么? 

1、@Conponent注解

 作用:表示把该类交给spring容器管理。

例如:

1、先写个用于给spring管理的类,UserImp

package com.frank.service;
​
import org.springframework.stereotype.Component;
​
/*** UserImp* 我要把该类交给spring容器管理* 按照以前的操作,在bean.xml文件中使用bean标签,给class属性一个值(值就是该类的全限定名)* 现在使用注解的方式平替,@Conponent*/
@Component("userImp")
public class UserImp {
}

2、再创建bean.xml,在里面开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd">
​
<!--    <bean id="userImp" class="com.frank.service.UserImp"></bean>-->
​<!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan>
​
</beans>

3、编写测试类,获取userImp对象

package com.frank;
​
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");Object userImp = app.getBean("userImp");System.out.println(userImp);}
}
2、@Controller+@Service+@Repository

@Controller注解:使用在Controller层的类上面

@Service注解:使用在Service层的类上面

@Repository注解:使用在Dao层的类上面

 3、@Scope+@Lazy+@PostConstruct+@PreDestroy

 @Scope注解:平替<bean scope="">,表示该类的作用域

@Lazy注解:平替<bean lazy-init="">,表示bean开启延迟加载

@PostConstruct注解:平替<bean init-method="">,表示告诉spring下面的方法是一个初始化方法

@PreDestroy注解:平替<bean destroy-method="">,表示告诉spring下面的方法是销毁方法

 例如:

 1、先写个用于给spring管理的类,UserImp

package com.frank.service;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


@Component// 该注解表示把该类交给spring容器管理
@Scope(value = "singleton")//该注解表示该类的作用域使用单例模式
@Lazy(true)//该注解表示bean开启延迟加载
public class UserImp {
    public UserImp() {
        System.out.println("构造方法执行。。。。");
    }
    @PostConstruct//该注解表示告诉spring下面的方法是一个初始化方法
    public void init(){
        System.out.println("初始化方法执行......");
    }
    @PreDestroy//该注解表示告诉spring下面的方法是销毁方法
    public void destroy(){
        System.out.println("销毁方法执行......");
    }
}

 此次省略bean.xml配置文件的代码,因为跟上一个例子一样。

 2、编写测试类,获取userImp对象

package com.frank;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 此类专用于测试
 */
public class TestApp {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
        Object userImp = app.getBean("userImp");
        System.out.println(userImp);
        app.destroy();
    }
}

4、@Value+@Autowired+@Qualifier+@Resource

 平替bean标签注入时的标签

原先使用xml实现注入的时候使用的是<property>标签来指明注入的关系;现在我们可以通过下面的注解来替换它。

@value注解:使用在字段或者方法上面,用于注入普通数据

@Autowired注解:使用在属性或者方法上面,用于注入引用数据(默认按照byType方式注入)

@Qualifier注解:使用在字段或者方法上面,搭配@Autowired根据名称进行注入

@Resource注解:不给参数的时候相当于@Autowired进行注入;给了参数相当于@Autowired+@Qualifier

 例如:

1、bean.xml中开启包扫描注解

<?xml version="1.0" encoding="UTF-8"?>
<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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd">
​<!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan>
​
</beans>

2、创建UserDao接口

package com.frank.dao;
​
public interface UserDao {
}
​

3、编写UserDao的实现类

package com.frank.dao;
​
import org.springframework.stereotype.Repository;
​
@Repository("userDaoImp")
public class UserDaoImp implements UserDao{
}
​

4、在UserImp类中添加两个属性,一个是普通字符串属性,一个是UserDao的引用

package com.frank.service;
​
import com.frank.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
​
@Service("userImp")
public class UserImp {@Value("frank")// 给属性name注入字符串类型的值String name;
​@Autowired// 根据类型,给userDao属性注入引用类型的值UserDao userDao;
​// 写个方法,里面打印两个属性,如果控制台打印有值说明注解注入成功public void show(){System.out.println(name);System.out.println(userDao);}
}
​

5、在测试类中测试运行

package com.frank;
​
import com.frank.service.UserImp;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");UserImp userImp = (UserImp) app.getBean("userImp");userImp.show();}
}

@Autowired注解是根据类型进行注入的,如果有多个UserDao类型,这个时候@Qualifier注解的作用就起来了,它的作用是当发现你使用了@Autowired注解后,却有多个相同的类型,可以通过@Qualifier注解指定其中的一个名字进行注入(按名字注入)。

5、@Bean

 @Bean注解:写在某个方法上面,一般用于注入非自定义的bean。

例如:

@Bean("dataSource")// 使用@Bean注解把dataSource()方法返回的对象交给spring管理

 

6、@Configuration+@ComponentScan+@PropertySource+@import

@Configuration 注解: 平替bean.xml文件

@ComponentScan 注解: 平替 <context:component-scan base-package="com.frank">

@PropertySource("jdbc.properties") 注解: 平替 <context:property-placeholder location="classpath:jdbc.properties">

@Import(MyDataSource.class)注解:平替 <import resource="classpath:">

 

注意:bean.xml文件都被配置类给替换了,那么我在写测试类创建容器对象的时候就不能用

new ClassPathXmlApplicationContext(“bean.xml”)了;而是选择使用new AnnotationConfigApplicationContext(SpringConfig.class)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python 爬虫入门(十二):正则表达式「详细介绍」
  • outlook在“对我发送的邮件应用规则”时只能移动邮件副本的问题和解决方案
  • 缔造“神话”的不止悟空,海信电视也有“画质神话”
  • 【2024年】为Python股票量化分析最新整理的免费股票数据API接口之实时数据
  • ROS机器人专用云台相机防抖摄像头
  • 2024Go语言面试宝典Golang零基础实战项目面试八股力扣算法笔记等
  • 【jvm】jvm方法和栈帧的关系
  • 【后端学前端】纯HTML实现响应式布局
  • 03-JavaScript高阶( 代码)
  • C语言—指针(2)
  • 结合量子技术解决数据传输安全
  • Flink 单机部署
  • 利用ce修改器进行漏洞挖掘(内存修改)
  • AI在医学领域:谷歌的HeAR生物声学模型
  • SQL Server事务日志文件过大的处理方法
  • const let
  • CSS盒模型深入
  • emacs初体验
  • idea + plantuml 画流程图
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java8-模拟hadoop
  • JavaScript 基础知识 - 入门篇(一)
  • js
  • passportjs 源码分析
  • Python实现BT种子转化为磁力链接【实战】
  • spark本地环境的搭建到运行第一个spark程序
  • 包装类对象
  • 从零开始学习部署
  • 关于List、List?、ListObject的区别
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 异常机制详解
  • - 转 Ext2.0 form使用实例
  • 走向全栈之MongoDB的使用
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #includecmath
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #QT 笔记一
  • (2)nginx 安装、启停
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (day6) 319. 灯泡开关
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (不用互三)AI绘画工具应该如何选择
  • (二)JAVA使用POI操作excel
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (全注解开发)学习Spring-MVC的第三天
  • (一)插入排序
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (杂交版)植物大战僵尸
  • (转载)从 Java 代码到 Java 堆
  • .bashrc在哪里,alias妙用