解决静态方法调用注入的service

1 在使用jpa的复杂查询时,声明了specification时声明为静态方法,导致注入的service无法使用,故想到俩种方式,一种手动注入,一种注解注入,此文使用的时注解注入;

解决静态方法调用注入的service

 1 // 先说一下解决方法
 2     @Autowired
 3     private AService aService;
 4
 5     // 声明静态变量,为了之后调用service
 6     public static ClassA classA;
 7
 8     // 关键:通过注解实现注入
 9     @PostConstruct
10          public void init() {
11              classA = this;
12              veesimpl.aService = aService;9     }
13
14     // 使用
15     veesimpl.aService.方法;

java开发之@PostConstruct执行顺序

  1 构造函数==》postConstruct==>init==destory==>predestory==卸载servlet;;
  2
  3 从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。
  4
  5 使用方式,例如:
  6
  7
  8 1     @PostConstruct                                 //方式1
  9 2     public void someMethod(){
 10 3         ...
 11 4     }
 12 5
 13 6     public @PostConstruct void someMethod(){        //方式2
 14 7         ...
 15 8     }
 16
 17 1[email protected]说明
 18
 19 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
 20
 21 2[email protected]说明
 22
 23 被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。(详见下面的程序实践)
 24
 25 3.程序实践
 26
 27 web.xml
 28
 29
 30 1 <!-- @PostConstruct和@PreDestroy注解 -->
 31 2   <servlet>
 32 3     <servlet-name>AnnotationServlet</servlet-name>
 33 4     <servlet-class>com.servlet.AnnotationServlet</servlet-class>
 34 5   </servlet>
 35 6 <servlet-mapping>
 36 7     <servlet-name>AnnotationServlet</servlet-name>
 37 8     <url-pattern>/servlet/AnnotationServlet</url-pattern>
 38 9   </servlet-mapping>
 39
 40 AnnotationServlet
 41
 42  1 package com.servlet;
 43  2
 44  3 import java.io.IOException;
 45  4 import java.io.PrintWriter;
 46  5 import java.sql.Time;
 47  6 import java.text.SimpleDateFormat;
 48  7 import java.util.Date;
 49  8
 50  9 import javax.annotation.PostConstruct;
 51 10 import javax.annotation.PreDestroy;
 52 11 import javax.servlet.ServletException;
 53 12 import javax.servlet.http.HttpServlet;
 54 13 import javax.servlet.http.HttpServletRequest;
 55 14 import javax.servlet.http.HttpServletResponse;
 56 15
 57 16 public class AnnotationServlet extends HttpServlet {
 58 17     SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");//设置日期格式,精确到毫秒
 59 18
 60 19     public AnnotationServlet(){
 61 20         System.out.println("时间:"+df.format(new Date())+"执行构造函数...");
 62 21     }
 63 22
 64 23     public void destroy() {
 65 24         this.log("时间:"+df.format(new Date())+"执行destroy()方法...");
 66 25         //super.destroy(); // Just puts "destroy" string in log
 67 26         // Put your code here
 68 27     }
 69 28
 70 29     @PostConstruct
 71 30     public void someMethod(){
 72 31         //this.log("执行@PostConstruct修饰的someMethod()方法...");//注意:这样会出错
 73 32         System.out.println("时间:"+df.format(new Date())+"执行@PostConstruct修饰的someMethod()方法...");
 74 33     }
 75 34
 76 35     @PreDestroy
 77 36     public void otherMethod(){
 78 37         System.out.println("时间:"+df.format(new Date())+"执行@PreDestroy修饰的otherMethod()方法...");
 79 38     }
 80 39
 81 40     public void doGet(HttpServletRequest request, HttpServletResponse response)
 82 41             throws ServletException, IOException {
 83 42         this.log("时间:"+df.format(new Date())+"执行doGet()方法...");
 84 43     }
 85 44
 86 45     public void init() throws ServletException {
 87 46         // Put your code here
 88 47         this.log("时间:"+df.format(new Date())+"执行init()方法...");
 89 48     }
 90 49
 91 50     protected void service(HttpServletRequest request, HttpServletResponse response)
 92 51                throws ServletException, IOException{
 93 52         this.log("时间:"+df.format(new Date())+"执行service()方法...");
 94 53         super.service(request, response);
 95 54     }
 96 55
 97 56 }
 98
 99 运行结果:
100
101
102
103 4.注意事项
104
105 注解多少会影响服务器的启动速度。服务器在启动的时候,会遍历Web应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果程序中没有使用任何注解,可以在web.xml中设置<web-app>的metadatacomplete属性为true来关掉服务器启动时的例行检查。
106
107
108
109 支持注解的服务器需要支持到Servlet2.5及以上规范,所以Tomcat要6.0.X及以上版本才行。

具体的使用方法

 1 @PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。
 2
 3 Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
 4
 5 通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
 6
 7 Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
 8
 9 实战:在静态方法中调用依赖注入的Bean中的方法。
10
11 package com.example.studySpringBoot.util;
12
13 import com.example.studySpringBoot.service.MyMethorClassService;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Component;
16
17 import javax.annotation.PostConstruct;
18
19 @Component
20 public class MyUtils {
21
22     private static MyUtils          staticInstance;
23
24     @Autowired
25     private MyMethorClassService    myService;
26
27     @PostConstruct
28     public void init(){
29         staticInstance.myService = myService;
30     }
31
32     public static Integer invokeBean(){
33         return staticInstance.myService.add(10,20);
34     }
35 }

这是关于@PostConstruct的一些解释,诸如执行过程之类的

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式:

@PostConstruct

Public void someMethod() {}

或者

public @PostConstruct void someMethod(){}

    被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行

被注解的Servlet生命周期需要注意的是,注解会多多少少地影响到服务器的启动速度。服务器在启动时候会遍历Web 应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果应用程序中没有 使用任何注解,可以在Web.xml中设置的metadata-complete属性为true.(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)

我现在要说的是用实例说明它有什么作用。
比如说我有一种情况,在我的servlet初始化加载之前我想处理一些东西,像加载缓存等等。
怎么做。@PostConstruct就派上用场了。那为什么这玩意用的不多呢,这是因为如果初始化之前我们要加载或处理某些玩意完全可以在构造器初始化时就处理了,但这种方法需要自己重写构造器。好吧。直接上代码看看具体用它的时候怎么做的。

原文地址:https://www.cnblogs.com/xiaoshahai/p/11610898.html

时间: 2024-10-12 10:18:06

解决静态方法调用注入的service的相关文章

关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service

如何在静态方法中调用注入的service Public class ClassA{ public static ClassA classA; @Resource private Service service; //原理时在工程启动时加载,在静态方法前加载,这样就可以在静态方法中调用注入的方法啦 @PostConstruct public void init() { classA = this; classA.service=service; }} 关于jpa的Specification自定义函

Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)

当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.lang.NullPointerException) 按上述步骤解决完自己的工具类后,你会发现项目运行后仍然报空指针此时你需要在applicationContext.xml 配置文件中添加一行配置文件 如图: 对自己工具类所在的包进行注解扫描,使Spring能够识别自己上面所配置的注解 原文地址:htt

dotnet core在Task中使用依赖注入的Service/EFContext

C#:在Task中使用依赖注入的Service/EFContext dotnet core时代,依赖注入基本已经成为标配了,这就不多说了. 前几天在做某个功能的时候遇到在Task中使用EF DbContext的问题,学艺不精的我被困扰了不短的一段时间, 于是有了这个文章. 先说一下代码结构和场景. 首先有一个HouseDbContext,代码大概是下面这样: public class HouseDbContext : DbContext { public HouseDbContext(DbCon

翻译-使用Spring调用SOAP Web Service

原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP的web service的整个过程. 指南内容 你将构建一个客户端,使用SOAP用来从远端的基于WSDL的web service获取天气数据.请访问http://wiki.cdyne.com/index.php/CDYNE_Weather进一步获取该天气服务的信息. 该服务根据邮编返回天气预测.你可

解决WCF调用时出现错误:“创建MTOM消息读取器时出错”

如题,查询一个数据集, 存储过程返回如:select * from B 中间层定义  public DataSet GetTable(string 查询条件); 客户端定义  DataSet ds = wcfClient.GetTable("") 以前一直正常着,查询也很快速,这两天不知修改到哪了,所有的查询如果返回记录较大时(100条左右),客户端就会出现服务端返回的异常错误"创建MTOM消息读取器时出错" 客户端 app.config 配置如下 <syst

依赖注入与Service Locator

为什么需要依赖注入? 普通的ServiceUser来负责直接创建所需Service实现的实例方法.拥有以下的局限 在不同的环境下,ServiceProvider是千差万别的(数据库,临时文件,内存). 所以,不能将ServiceUser作为组件发布(适应不了各种差异环境). 为了将ServiceUser所在单元作为组件发布,必须满足以下的条件. 将ServiceUser与具体的ServiceProvider_Imp解耦(解除编译时依赖).即不能出现new ServiceProvider_Imp(

静态方法调用内部类时候的new 问题

package tool; /** * 静态方法调用内部类时候的new 问题 */ public class aa { // 静态方法 // 静态方法new 有问题 public static void aa() { bb b = new bb(); //报错 bb b1 = new aa().new bb();//没问题 //解决方法 /* * 1.内部类设置成静态类 * 2.内部类new的方式 bb b = new aa().new bb() * */ } // 非静态的方法直接new,没有

spring springboot websocket 不能注入( @Autowired ) service bean 报 null 错误

spring 或 springboot 的 websocket 里面使用 @Autowired 注入 service 或 bean 时,报空指针异常,service 为 null(并不是不能被注入). 解决方法:将要注入的 service 改成 static,就不会为null了.参考代码: @Controller @ServerEndpoint(value="/chatSocket") public class ChatSocket { // 这里使用静态,让 service 属于类

使用XmlInclude解决WebService调用时无法识别子类的异常

一.定义抽象类及子类,WebMethod实际返回子类参数 //使用XmlInclude解决WebService调用时无法识别子类的异常 [System.Xml.Serialization.XmlInclude(typeof(WageEmploeyee)), System.Xml.Serialization.XmlInclude(typeof(Boss))] public abstract class EmployeeData { //Required by XmlSerializer publi