注解配置spring
1、为什么使用注解配置Spring
基于注解配置的方式也已经逐渐代替xml。这个是不可逆的潮流,所以我们必须要掌握使用注解的方式配置Spring
总结:
(1)使用注解配置Spring,注解的作用就是用于替代XML配置文件的。
(2)XML配置文件,非编程语言语法,所以无法调试
(3)使用注解配置的代码,更加容易定位问题
2、注解配置步骤
第一步:在基于注解的配置中,我们还要多拷贝一个aop的jar包
第二步:在类的根路径下创建一个任意名称的xml文件(不能是中文)

第三步:创建一个测试的服务类,并且加入使用@Component注解,声明该类允许注入到Spring容器
第四步:在spring的配置文件加入扫描注解
组件扫描标签:扫描指定的包的组件类,就会将这些加了组件注解的类创建对象放在容器里面,cn.ong为要扫描的包名
<context:component-scan base-package="cn.ong"></context:component-scan>
第五步:测试调用代码
3、Spring常用注解说明
(1)用于对象的注解:将用于被扫描创建对象的注解,统称为组件注解。
组件注解包括:@Component,@Controller,@Service,@Repository,功能上没有任何区别,只是概念上不一样,组件在spring-context-4.2.9.RELEASE.jar包里面的org.springframework.stereotype包下

(2)Spring第一版注解的实现(spring 2.5),就是使用一个@Component。从3.0以后,根据分层的需要,把它拆成了四个。为了可以让开发人员,可见即可得,一看到注解,立即知道类的性质所以分成了四个
@Controller:用于声明表示层的组件注解
@Service:用于声明服务层的组件注解
@Repository:用于声明持久层的组件注解
@Component:用于声明三层以外的组件注解
4、用于依赖注入的注解
(1)@Autowired注解:用于给引用注入容器的对象。
属性 required:指定注入的对象是否允许为空,如果required=true。表示不可以为空,会报异常
(2)使用@Autowired注入的三种情况
放在属性上注入
放在方法上注入
放在构造方法上注入
(3)@Qualifier注解:用于强制指定注入的对象名,使用@Autowired注入对象时,@Autowired没有指定对象名的属性,只能通过@Qualifier字段容器中对象名
属性value:指定注入Spring容器中对应对象名的对象给引用。
@Qualifier(value="指定的名字")
(4)@Resource注解:用于给引用注入容器的对象,可以通过name属性指定对象名
@Resource(name="指定的名字")
注意事项:@Resource只能注入方法和属性,不能注入构造方法

(5)通过查看注解的声明,理解注解可以存放的位置以及有哪些属性,要学会通过注解声明的@Target的类型类来分析,注解可以放的位置

(6)@value 注解:value只能设置(基础数据类型+包装类+String)
@Value注解:注入基本数据类型以及它们的包装类和String类型数据的,支持${}注入Properties文件的键值对,等同 <proprty name=”...” value=”${Key}”>
例如配置在属性上:
@Value("张三")
private String name;
@Value("20")
private int age;
@Autowired
@Qualifier("now")
private Date createDate;
例如配置在构造方法上:
public CustomerService(@Value("张三")String naem, @Value("20")int age,@Autowired @Qualifier("now") Date createDate) {
super();
this.naem = naem;
this.age = age;
this.createDate = createDate;
}
注入其他类型的时候,可以先注入@Autowired,然后注入@Qualifier("now"),强制指定输入的值,now为在xml配置文件上配置的java类 <bean name="now" class="java.util.Date"></bean>
(7)@Scope 注解来指定对象的生命周期的,取值为:singleton prototype request session
@Scope("singleton")设置为单例,或者设置为:@Scope(value=BeanDefinition.SCOPE_PROTOTYPE)
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要容器还在,一直活着
对象死亡:应用停止,容器销毁,对象死亡
@Scope("singleton")设置为多例(原型对象)
对象出生:当程序加载配置文件创建容器时创建对象
对象活着:只要对象被使用,一直活着
对象死亡:对象长时间不用,会被Java垃圾回收机制回收
*reqeust:web项目中,Spring将创建的对象放在request作用域中
*session:web项目中,Spring将创建的对象放在session作用域中
(8)@PostConstruct :等同于<bean init-method=””>
作用:用于指定初始化方法。
(9)@PreDestroy:等同于<bean destory-method=””>
作用:用于指定销毁方法。
5、纯注解配置 @Configuration
第一步:添加@Configuration在配置类ApplicationContextConfig上,声明该类是配置类,加上@Configuration,xml配置文件可以不需要再配置
第二步:添加@ComponentScan(basePackages="cn.ong") 在配置类ApplicationContextConfig上,配置扫描的包
第三步:编写测试类,创建配置文件类创建容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
第四步:拿到容器中的对象 context.getbean("默认的类名",类.class),使用该对象
6、注解说明
(1)@Configuration 配置类注解,在纯注解配置中,加了该注解就意味着该类是Spring的配置类。该类的功能就是用于替代原来的XML配置文件。
使用: 获取容器时需要使用AnnotationConfigApplicationContext(有@Configuration注解的类.class)。
(2)@ComponentScan注解类,作用就是配置扫描Spring组件类的路径。作用和在spring的xml配置文件中的:
<context:component-scan base-package="com.sxt"/>是一样的。
属性: basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
(3)@PropertySource注解 用于加载 .properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
属性:encoding:编码格式
value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
例如:@PropertySource(encoding="utf-8",value="customer.properties")
@PropertySource注解,因为4.2版本的Spring容器初始化的时候,没有默认创建PropertySourcesPlaceholderConfigurer对象。需要手工创建一个静态方法来或者该对象,静态的方法会在创建容器之前创建该对象,用于读取@PropertySource的值。所以方法必须要静态
例如:
@Bean
public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
(4)@Bean注解 该注解只能写在方法上,使用此方法创建一个对象,并且放入spring容器。它就相当于我们之前在xml配置中介绍的<bean标签>
属性name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
(5)@Import注解 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解
属性: value[]:用于指定其他配置类的字节码。
例如:@Import(value=Text.class)
7、JUnti:是一个单元测试框架,所谓的单元测试就是可以对单个方法测试
JUnti 就是main,一个类只能写一个main方法,而JUnti框架可以在一个类里面写的多个方法
(1)使用:在类上加上 @Test ,然后倒入JUnti类库
(2)属性: @Test (timeout=1000),测试性能,就是规定时间(1秒)内没有运行完会报错
整合,不需要再手动创建容器:
第一步:在执行JUnti之前,加载SpringJUnit4ClassRunner执行器,把对象放到容器中
@RunWith(value=SpringJUnit4ClassRunner.class)
第二步:配置xml文件 @ContextConfiguration(locations="classpath:applicationContext.xml")
第三步:在测试类中创建属性,通过依赖注入来拿对象,以后就不需要再创建容器,关闭容器
@Autowired
HelloWorldService helloWorldService;
8、注解语法构造
(1) Annotation接口:是所有注解的父类,可以接收所以注解的对象
(2) Documented注解:是一个基础注解,用于声明注解是支持生成javadoc文档的注释
(3)ElementType枚举:是一个注解可以放在的位置的类型。
(4) Inherited注解:是一个基础注解,用于声明注解在使用可以支持被子类继承
(5) Retention注解:用于指定注解撤策略,这个注解是使用什么策略的
(6) RetentionPolicy枚举:注解的策略类型
CLASS:编译后还在字节码里面,但运行的时候,忽略,很少用,因为不支持反射读取
RUNTIME:支持反射读取,最常用
SOURCE:编译后的代码就不存在这个注解了,(看一下)
9、注解入门
第一步:创建注解

第二步:配置注解类
@Target(value = { ElementType.FIELD, ElementType.METHOD }) //指定注解只能放在或属性上
@Retention(RetentionPolicy.RUNTIME) //设置注解能被反射技术读取
@Documented //支持生成javadoc
public @interface Value {
String value() default "";
}
第三步:声明一个类,使用该注解依赖注入
@Value("zhangsan")
public String name;
public String getName() {
return name;
}
第四步:编写测试类
@Test
public void test() throws Exception {
UserAction userAction = new UserAction();
//通过反射技术对value注解进行解释,让它具有将值赋予给属性的字段
Class<UserAction> userActionClass = UserAction.class;
Field field = userActionClass.getField("name"); //获得该类的属性
Value value = (Value) field.getDeclaredAnnotations()[0]; //获得该注解的注解
if (value != null) {
field.setAccessible(true); // 将私有的属性设置为可访问的
field.set(userAction, value.value()); //设置
}
System.err.println(userAction.getName());
}
注解配置spring的更多相关文章
- JAVAEE——spring02:使用注解配置spring、sts插件、junit整合测试和aop演示
一.使用注解配置spring 1.步骤 1.1 导包4+2+spring-aop 1.2 为主配置文件引入新的命名空间(约束) 1.3 开启使用注解代替配置文件 1.4 在类中使用注解完成配置 2.将 ...
- 使用注解配置Spring
使用注解配置Spring 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 将对象注册到容器 修改对象的作用范围 值类型注入 引用类型注入 注意: 初 ...
- Spring系列之新注解配置+Spring集成junit+注解注入
Spring系列之注解配置 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率 你本来要写一段很长的代码来构造一个 ...
- Spring学习笔记(三)—— 使用注解配置spring
一.使用步骤 1.1 导包 1.2 为主配置文件引入新的命名空间(约束) 在applicationContext.xml中引入context约束 1.3 编写相关的类 public class Use ...
- 基于注解配置spring
1 对 bean 的标注基于注解方式有3个注解 @Component @Repository 对DAO类进行标注 @Service 对Service类进行标注 @Controller 对Contro ...
- 02-使用注解配置spring
1 准备工作 1.导包 4+2+spring-aop[新版本需要导入 spring-aop 包] 2.为主配置文件引入新的命名空间(约束) [context] 3.开启使用注解代理配置文件 4.在类中 ...
- 使用注解配置Spring框架自动代理通知
话不多说上代码 项目架构图及Lib包如下: 第二步创建业务类接口 package cn.happy.day01.entity; /** * 1.业务接口 * @author Happy * */ pu ...
- 基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
- 基于注解的Spring AOP的配置和使用--转载
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
随机推荐
- Go笔记
#Go在win下安装 1. https://golang.google.cn/dl/下载 amd64 版本的zip包 2. 解压后将bin目录添加入path 3. go version可显示版本信息
- 《Redis 使用规范》
一:Redis 概述 - Redis 是内存级别的数据库,在一台普通电脑上,Redis 3.X 便可以读取 10 万个键值对(现在的Redis官方版本已经更新到了5.X,性能会更好). 二:关于Red ...
- Nginx(一)-windows下的安装配置
第一步 下载 官网下载地址 因为只是测试这里选择最新版本1.13.9 下载完成得到zip压缩包 解压后得到如下目录 第二步 启动nginx 注意不要直接双击nginx.exe,这样会导致修改配置后重 ...
- C语言扫盲及深化学习
c语言特点: (1)效率高 (2)控制性强 (3)硬件亲和性好 (4)可移植性高 一.关于注释 c语言中注释不能嵌套,因此注释代码时一定要注意源代码中是否已经存在注释.要从逻辑上删除一段代码,利用预编 ...
- 了解JVM运行时的内存分配
了解JVM运行时的内存分配 前言 上文中,在介绍运行时数据区域中的 JAVA 堆时,提到了 JVM 中的堆,一般分为三大部分:新生代.老年代.永久代,本文将进一步了解运行时的内存分配情况. 正文 1. ...
- python continue的应用
count = 1sum = 0while count < 100: if count == 88: count += 1 continue if count % 2 == 0: sum = s ...
- 内网gitlab11.2升级至11.4.5
当前gitlab版本 宿主机是一台ubuntu 运行备份命令 sudo gitlab-rake gitlab:backup:create STRATEGY=copy 升级命令 sudo apt-get ...
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165321
安装kali 在vm里面新建虚拟机,选择典型 选择安装程序光盘镜像文件,系统出现无法检测此光盘镜像中的操作系统 虚拟机命名选择安装位置 给虚拟机分配的磁盘大小 点击自定义硬件,更改虚拟机硬件 选择Gr ...
- jquery的输入框自动补全功能+ajax
jquery的输入框自动补全功能+ajax 2017年05月10日 18:51:39 辣姐什么鬼 阅读数:1461 标签: web前端 更多 个人分类: web前端 内容参考网友文章写成,原博的链 ...
- Linux定时任务调用sh文件
1.编写sh文件 创建:vi test.sh 写入:date >> /xiaol/data.txt 2.默认创建的这个sh问件是没有执行权限的,修改权限 chmod 777 test.sh ...