JavaWeb注解
java中有很多注解
按运⾏机制分
源码注解 只在源码中存在
编译时注解 在class中依然存在,如@Deprecated
运⾏时注解 运⾏阶段起作⽤,如@Autowired
按来源分
JDK⾃带注解
三⽅注解 最常见
⾃定义注解
元注解
注解的注解
spring常见注解:
@Controller, @Service, @Repository,@Component
这4种注解意思是⼀样,并没有什么区别,区别只是名字不同
当使⽤这四个注解的时候,对应的类就已经被spring加载到ioc容器中了,不需要在写<bean id="" class =“”>这样的配置了
所以可以在Controller中autowired 类似的Userservice接⼝,因为已经在容器中存在,直接装载即可
1、@Controller ⽤于标记在⼀个类上,使⽤它标记的类就是⼀个SpringMVC Controller 对象。分发处理器将会扫描使⽤了该注解的类的⽅法。通俗来说,被Controller标记的类就是⼀个控制器,这个类中的⽅法,就是相应的动作
resource和autowired注解的区别2、service层采⽤@Service注解
@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名
字必须叫做"userService",这样当Action需要使⽤UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注⼊给Action。
3、dao层采⽤@Repositoryz注解
@Repository(value="userDao")注解是告诉Spring,让Spring创建⼀个名字叫“userDao”的UserDaoImpl实例。
当Service需要使⽤Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使⽤@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注⼊给Service即可
4、@component (把普通pojo实例化到spring容器中,相当于配置⽂件中的<bean id="" class=""/>)
泛指各种组件,就是说当类不属于各种归类的时候(不属于@Controller、@Services等的时候),可以使⽤@Component来标注这个类
使⽤举例:
<context:component-scan base-package=""/>扫描被注解的类
上⾯的这个例⼦是引⼊Component组件的例⼦,其中base-package表⽰为需要扫描的所有⼦包
@RequestMapping是⼀个⽤来处理请求地址映射的注解,可⽤于类或⽅法上。⽤于类上,表⽰类中的所有响应请求的⽅法都是以该地址作为⽗路径
@Autowired
在Spring 2.5 引⼊了 @Autowired 注释, 通过 @Autowired的使⽤来消除 set ,get⽅法
在启动spring IoC时,容器⾃动装载了⼀个AutowiredAnnotationBeanPostProcessor后置处理器
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器⾃动查需要的bean,注意是根据类名查,⽽不是通过bean的Id 来查询,并装配给该对象的属性。
这就是为什么@Autowired ⼀个接⼝的原因,因为该类继承⾃接⼝,所以该类就是该接⼝类型
注意事项:
在使⽤@Autowired时,⾸先在容器中查询对应类型的bean
如果查询结果刚好为⼀个,就将该bean装配给@Autowired指定的数据
如果查询的结果不⽌⼀个,那么@Autowired会根据名称来查。
如果查询的结果为空,那么会抛出异常。解决⽅法时,使⽤required=false
如果查询的结果不⽌⼀个的话,有两个类如何区分开这两个呢?
可以提供了⼀个@Qualifier标记,来指定需要装配bean的名称,代码这样写:
@Autowired
@Qualifier("userJdbcImps")
private UserRepository userRepository;
除此之外四⼤注解还有很多有⽤的注解
1、@Override:标⽰当前的⽅法定义将覆盖超类中的⽅法他告诉我们同时也告诉编译器我们的这些⽅法肯定覆盖了类**⾥⾯的⽅法,如果注释掉类**⾥⾯的⽅法 那么就会报错,它需要全部覆盖某个接⼝的⽅法。
2、@Deprecated:它标记就表明这个⽅法已经过时了,在实际中,我们不想⽤到⼀个⽅法,但是这⽅法的接⼝正在使⽤,那我们就可以⽤它注解
3、SuppressWarnings:忽略编译器警告信息
SpringMVC中的⼀些取参数的注解
@RequestMapping 解决乱码
@RequestMapping(value="/pic/upload",produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8")
public String uploadPic(){
return "aaa";
}
1.@PathVariable:从url路径中取参数
@RequestMapping("/queryfull/{name}")
public void getfullItemList(@PathVariable String name){}
2.@RequestParam:从url路径中取参数
如url为www.aaa/hello?id=99
@RequestMapping("/list")
public String categoryList(@RequestParam(value="id", defaultValue="0") Long parentId) {
//把id取出来,赋给parentId,默认值为0
return parentId;
}
@RequestParam 有三个属性:value必填,required和defaultValue 可填可不填
value:请求参数名
required:是否必需,默认为 true,即请求中必须包含该参数,如果没有包含,将会抛出异常
defaultValue:默认值,如果设置了该值,required 将⾃动设为 false,⽆论你是否配置了required,配置了什么值,都是 false
3.可以通过Parameter("xxx")来取url的参数
如url为www.aaa/hello?id=99
@RequestMapping("/hello")
public Item showItem(HttpServletRequest request) {
int Id = Integer.Parameter("id"));
return id;
}
4.通过@Value取配置⽂件中的值
配置⽂件resource.properties
#相关全局配置
BASE_URL =102.651.412.12
BASE_PORT=21
Java代码如下:
@Value("${BASE_URL}")
private String BASE_URL;
JSON过滤某些属性的注解:
1.⽤@JsonIgnore注解,这样返回的json中就会过滤该属性,如:
2.或者使⽤ @JsonIgnoreProperties(value={"id","market"})
⽀持过滤多个,但是要写在pojo 实体类 class上⽅,如:
过滤返回的json中属性值null的属性
1.引⼊jackson的Maven依赖
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
2.在实体类的上⽅或者属性上加上@JsonInclude(Include.NON_NULL)
//对实体类中的所有属性全部进⾏过滤
@JsonInclude(Include.NON_NULL)
public class Student{
private String userName;
private String realName;
}
//对实体类中的部分属性全部进⾏
public class Student{
@JsonInclude(Include.NON_NULL)
public String userName;
public String realName;
}
3.具体属性值含义如下:
Include.Include.ALWAYS: 默认
Include.NON_DEFAULT :属性为默认值不序列化
Include.NON_EMPTY: 属性为 空(“”) 或者为 NULL 都不序列化Include.NON_NULL 属性为NULL 不序列化
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论