JavaWeb 注解

10 篇文章 0 订阅

java中有很多注解

按运行机制分

  • 源码注解 只在源码中存在
  • 编译时注解 在class中依然存在,如@Deprecated
  • 运行时注解 运行阶段起作用,如@Autowired

按来源分

  • JDK自带注解
  • 三方注解 最常见
  • 自定义注解

元注解

  • 注解的注解

 

spring常见注解:

@Controller, @Service, @Repository,@Component
这4种注解意思是一样,并没有什么区别,区别只是名字不同
当使用这四个注解的时候,对应的类就已经被spring加载到ioc容器中了,不需要在写<bean id="" class =“”>这样的配置了
所以可以在Controller中autowired  类似的Userservice接口,因为已经在容器中存在,直接装载即可

1、@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作
 

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="com.xxx.xxx"/>扫描被注解的类
上面的这个例子是引入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.com/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.可以通过request.getParameter("xxx")来取url的参数

如url为www.aaa.com/hello?id=99

@RequestMapping("/hello")
    public Item showItem(HttpServletRequest request) {   
        int Id = Integer.parseInt(request.getParameter("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.fasterxml.jackson.core</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 不序列化

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值