java 注解说明

@Component @Repository @Service @Controller

这四个注解功能相同都是标注在类上,被标注的类可以被Spring容器扫描并管理,打开@Repository @Service @Controller这三个注解的源码你会发现他们都是被@Component标注的。
而且可以指定一个value为注解所标注的类的Id,如@Repository(value = "loginLog")或@Repository("loginLog"),这样通过getBean("loginLog")获得LoginDao这个bean的实例。与xml配置方式中<bean id="loginLog" class="com.smart.domain.LoginLog" ></bean>作用相同。

 

@Lazy 延迟依赖注入

可以标注在类、方法、构造器、参数、属性上。被标注的内容会延迟依赖注入。如标注在属相上只有调用该属性时才会被注入。要注意的是@Lazy必须同时标注在bean与属性上才有效。请看下图here one与here two。

 

@Autowired 自动装配

可以标注在方法、属性、构造器、注解上。实现自动依赖注入,当IOC容器中存在@Autowired标注的类型是,将通过byType形式注入。与xml配置bean中的参数 autowire="byType"功能相同,在xml中默认是通过byType自动匹配。

当IOC容器中不存在需要注入的类型时,将出现异常。@Autowired有一个参数required会进行依赖检查,该参数默认是true也就是依赖检查不通过会报异常,可以使用参数required=false忽略依赖检查。
这里需要说一下@Resource这个注解是由JRE提供的,它是按照名称装配的。标注在属性上如果没有提供名称则按照属性的变量命名装配,标注在setter方法上没有提供名称则按照setter方法返回的属性值装配。如非必要我个人还是推荐使用spring的@Autowired。

 

@Required 依赖检查

可以标注在方法上。被标注的方法必须被依赖注入配置一个值,否则将出现BeanCreationException异常。如有一个setIp被标注了,那么在xml还是注解方式都应该配置一个值。如下图:

 

@Qualifier 指定bean的注入名称

当IOC容器中通过有一个以上可以注入的类型时,可以通过Qualifier指定注入bean的名称。

 

@Scope 作用域

与xml配置bean中的scope属性功能相同都是声明bean的作用范围,取值默认是singleton,可选属性有prototype、session、request、singleton。


还可以与javaconfig中的@Bean配合使用,当然功能还是一样的都是声明一个Bean的作用域。

 

@PostConstruct 初始化方法

该注解属于JSR-250中的,不是Spring提供的注解,在Spring中等于xml配置中的init-method属性,在一个bean中可以配置多个。

 

@PreDestroy 销毁方法

该注解属于JSR-250中的,不是Spring提供的注解,在Spring中等于xml配置中的destroy-method属性,在一个bean中可以配置多个。当IOC容器关闭时调用该注解标注的方法。

 

@Configuration 配置bean信息

一个普通的POJO类被@Configuration标注用于描述bean的信息,它的功能相当于xml配置中的application.xml。前者更灵活后者配置上要简单些。举例如下图:两种方式效果是一样的,

 

@Bean 在JavaConfig中定义一个Bean

与@Configuration配合使用,功能与xml<bean>相同,可以指定名字name(可以多个),初始化方法initMethod=方法名称,销毁方法destroyMethod=方法名称。

 

@Import 导入配置

在使用JavaConfig配置spring时,可能会使用多个配置类(@Configuration),这时可以使用@Import将其他的配置类导入到一个主配置类中。其功能与xml配置方式中的<import resource=""/>完全相同。看下面示例:LoginLog是在AppConfig2中配置的,AppConfig导入了AppConfig2,在ICO容器中注册的是AppConfig,经过测试注入成功。

 

@ImportResource 导入xml配置

使用JavaConfig配置spring时,如果想要JavaConfig使用xml配置的bean,可以使用这个标签。在xml配置了一个Bean,将xml导入JavaConfig中,示例如下:



@SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置功能,该注解是一下三个注解的组合体。

Spring的@Configuration:标明该类使用Spring基于Java的配置。

Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被 自动发现并注册为Spring应用程序上下文里的Bean。

Spring Boot的@EnableAutoConfiguration:这个不起眼的小注解也可以称为@Abracadabra1,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了。

@PathVariable 与 @PathParam 详见下面示例。

==========================写的太tm乱了看的我自己都眼晕==========================

@PathVariable

据说@PathVariable 是RSET风格的springmvc取值。

http://127.0.0.1:8080/tangyaliang

此种获取参数值的方式,需要在value中指定一个key,并且在方法参数中一定要有这个key不然报500错误

在简单点说就是@RequestMapping中有的参数名称方法中可以没有,但是方法中有的参数名称@RequestMapping一定要有。

{name}对应的@PathVariable(name = "name")中的"name",如果参数String name与地址中{name}名称相同

那么@PathVariable(name = "name")可以忽略name属性

经过我的简单测试 @PathVariable 属性name与value功能相同

required=true 地址中如果没有这个这个参数会报错,=false会忽略与@Autowired中的required功能相同

下面的例子输入结果是:Hello tangyaliangtangyaliang

@RestController
@RequestMapping("/")
public class ChineseDrugController {
	@ResponseBody
	@RequestMapping(value = "/{name}")
	public String showName(@PathVariable String name, @PathVariable(value = "name", required = false) String sex) {
		return "Hello " + name + sex;
	}
}
@RestController
@RequestMapping(value = "/{sex}")
public class ChineseDrugController {
	@ResponseBody
	@RequestMapping(value = "/{name}")
	public String showName(@PathVariable String name,@PathVariable(value = "sex",required = false) String sex) {
		return "Hello " + name + " " + sex;
	}
}
http:// 127.0.0.1:8080/唐/男,得到的输出是 Hello 唐 男

 

当看到这会想如果获得多个值应该怎么办,那就是这样了,注意show只是一个地址的标示。

 

@RequestMapping(value = "/{name}/{sex}/{n}/show")
	public String showName(@PathVariable String name,@PathVariable String sex) {
		return "Hello " + name + " " + sex;
	}

 

@PathParam

 

这个注解相对简单,就是从地址栏取参数值,采用的是传统的?name=唐&sex=男。

不同的是@PathVariab在没有对应属性时会是一个null值,不会报错。

通过访问地址:http://127.0.0.1:8080/namevalue/sexvalue?name=唐&sex=男

得到的输出结果是 Hello 唐 男

@RestController
@RequestMapping(value = "/{sex}")
public class ChineseDrugController {
	@ResponseBody
	@RequestMapping(value = "/{name}")
	public String showName(@PathVariable(value = "name") String name, @PathParam(value = "sex") String sex) {
		return "Hello " + name + " " + sex;
	}
}

注意在以上代码中/{sex}与/{name}可以匹配到任意根目录开始的级别例如:127.0.0.1/任意/任意。

如果带有项目名称的路径那么就是127.0.0.1/项目名称/任意/任意。所以在此演示代码中无需管它,它就是一个路径,知道含义即可。写代码时一定注意不能这么搞。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值