当前位置: 首页 > 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)。


http://www.mrgr.cn/news/12405.html

相关文章:

  • vue新建按钮弹出选框
  • 软件中的重构
  • x264 编码器 AArch64汇编系列:运动补偿之mc_luma_neon函数
  • Failed to connect to the remote extension host server
  • STM32外部中断事件控制器-EXTI
  • 成功解决:jenkins构建失败,cannot open directory /home/centos/: Permission denied等问题
  • SFF1604-ASEMI无人机专用SFF1604
  • DAY5:HTTPS和HTTP有哪些区别 | HTTPS的工作原理(HTTPS建立连接的过程)| TCP和UDP的区别
  • Ubuntu搭建FTP服务器
  • vue3使用swiper实现首页图片轮播并自定义左右箭头样式及分页器样式
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • Chromium编译指南2024 - Android篇:安装并运行(九)
  • pyflink中UDTF和UDF的区别
  • PPT到PDF转换器:一个功能强大的Python GUI应用(unzip,convert,replace,merge)
  • 18行为型设计模式——观察者模式
  • CSS学习【margin为负值】
  • Python selenium爬虫被检测到,该怎么破?
  • UE5 多个类选择界面生成
  • 小程序自定义组件配合插槽和组件传值
  • 安卓全盘加密 (Full-Disk Encryption, FDE) 概述