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标记的类就是一个控制器,这个类中的方法,就是相应的动作
 

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 不序列化

### Java Web注解的使用方法与示例 #### 一、什么是注解注解(Annotation)是在 JDK 5.0 版本引入的一种元程序工具,用于提供有关程序代码的额外信息。它们不会直接影响程序的功能,但在编译阶段或运行时可以通过反射机制读取并执行特定操作。 --- #### 二、Java Web 开发中常见的注解及其用途 在 Java Web 应用开发过程中,注解被广泛应用于简化配置和增强功能。以下是几个典型场景: 1. **监听器注册** 使用 `@WebListener` 将类声明为 ServletContext 的生命周期事件监听器[^1]。 ```java import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Application started"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("Application stopped"); } } ``` 2. **获取方法上的注解** 可通过反射技术提取方法上定义的注解,并进一步解析其属性值[^2]。 ```java import java.lang.reflect.Method; public class AnnotationExample { public static void main(String[] args) throws Exception { Method method = MyClass.class.getMethod("myMethod", null); if (method.isAnnotationPresent(MyCustomAnnotation.class)) { MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class); System.out.println(annotation.value()); } } } @MyCustomAnnotation(value = "This is a custom annotation") class MyClass { public void myMethod() {} } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface MyCustomAnnotation { String value(); } ``` 3. **自定义注解的应用** 自定义注解通常配合 AOP 或其他框架扩展来完成业务需求。例如,记录方法执行时间的注解[^5]。 定义注解: ```java package com.example.annotations; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogExecutionTime { } ``` 配合切面实现逻辑: ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class ExecutionTimeLogger { @Around("@annotation(com.example.annotations.LogExecutionTime)") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long endTime = System.currentTimeMillis(); System.out.println(joinPoint.getSignature() + " executed in " + (endTime - startTime) + "ms"); return result; } } ``` 4. **Spring MVC 控制器映射** Spring 框架提供了丰富的注解支持,比如 `@Controller`, `@RequestMapping` 等,用于简化 URL 映射和参数绑定过程[^3]。 ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String sayHello() { return "Hello, World!"; } } ``` 5. **持久层注解** 在数据访问层中,JPA 提供了诸如 `@Entity`, `@Table`, 和 `@Column` 这样的注解,帮助开发者描述实体对象与数据库表之间的关系。 ```java import jakarta.persistence.Entity; import jakarta.persistence.Id; @Entity public class User { @Id private Long id; private String name; // Getters and Setters omitted for brevity } ``` 6. **动态加载自定义注解** 如果需要在运行期间动态加载某个类或者方法上的注解,则可以利用反射 API 实现[^4]。 ```java import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface CustomAnnotation { String value() default ""; } @CustomAnnotation("Sample Value") public class TestClass {} public class MainApp { public static void main(String[] args) { Class<?> clazz = TestClass.class; if (clazz.isAnnotationPresent(CustomAnnotation.class)) { CustomAnnotation annotation = clazz.getAnnotation(CustomAnnotation.class); System.out.println(annotation.value()); } } } ``` --- ### 总结 上述例子展示了如何在不同层次上应用注解来优化 Java Web 应用的设计与维护工作流。无论是基础的 Servlet 监听器设置还是复杂的 AOP 切片编程模型,都可以借助于灵活多变的注解体系达成目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值