Springboot 在普通类型注入Service或mapper
程序员文章站
2022-06-23 12:13:25
目录springboot 在普通类型注入service或mapper1.由于之前都是通过controller调用service层来实现访问2.在拿到数据之后,掉service时出现空指针springb...
springboot 在普通类型注入service或mapper
最近遇到一个难题(大佬可能感觉这太简单了把),对于我这样的小白来说,确实有些头疼。
接下来说一下我遇到的问题,在spring boot中创建了一个udp客户端,用于监听udp服务端发送到数据。在实现这一功能时遇到主要遇到了两个难题
1.由于之前都是通过controller调用service层来实现访问
现在要建立一个持久的连接来实现监听某一端口的数据,由于做的项目不多,经验不足,spring也没怎么学过所以困扰了很久。
只是在main方法中开启一个线程简单的new创建实例解决了该问题,虽然不知道这样做对不对,但是能实现功能。(如有更好的办法请告诉小白,谢谢)
@springbootapplication @mapperscan("com.example.net.udpservicertest.mapper") public class udpservicertestapplication { public static void main(string[] args) throws exception { springapplication.run(udpservicertestapplication.class, args); new thread(()->{ try { udpservice udpservice = new udpservice(); udpservice.startsocketserver(); } catch (exception e) { e.printstacktrace(); } }).start(); } }
客户端虽然能够启动,但是新的问题又来了
2.在拿到数据之后,掉service时出现空指针
这又困扰了小白两天,通过得到了这样的解决方案
(1)首先需要新建一个类,实现 applicationcontextaware 接口。
要@conponment注解
@component public class springutils implements applicationcontextaware { private static applicationcontext applicationcontext = null; @override public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception { if(springutils.applicationcontext == null){ springutils.applicationcontext = applicationcontext; } } //获取applicationcontext public static applicationcontext getapplicationcontext() { return applicationcontext; } //通过name获取 bean. public static object getbean(string name){ return getapplicationcontext().getbean(name); } //通过class获取bean. public static <t> t getbean(class<t> clazz){ return getapplicationcontext().getbean(clazz); } //通过name,以及clazz返回指定的bean public static <t> t getbean(string name,class<t> clazz){ return getapplicationcontext().getbean(name, clazz); } }
(2)在udp类中获取applicationcontext对象,然后去获取需要的service 或者 dao。
@service注解,将自动注册到spring容器,不需要再在applicationcontext.xml文件定义bean了,类似的还包括@component、@repository、@controller。
applicationcontext又是spring管理bean的容器,加载配置文件的时候,就会将spring管理的类都实例化。所以就能够注入到该实例。
public class udpservice { private applicationcontext applicationcontext=springutils.getapplicationcontext(); private userserviceimpl userservice=applicationcontext.getbean(userserviceimpl.class); public void startsocketserver() throws exception { datagramsocket ds = new datagramsocket(10000); while (true) { // 2.创建数据包 byte[] buf = new byte[1024]; datagrampacket dp = new datagrampacket(buf, buf.length); // 3.使用接受方法将数据存储到数据包中 ds.receive(dp);// 阻塞式的 // 4.通过数据包对象的方法,解析其中的数据 数据内容 // string ip = dp.getaddress().gethostaddress(); // int port = dp.getport(); string text = new string(dp.getdata(), 0, dp.getlength()); system.out.println(""+text.length()); system.out.println(""+text); // byte[] data = dp.getdata(); string[] split = text.split("#"); system.out.println(split[0]); userservice.updateuser(split[0],split[1]); thread.sleep(3000l); } } } @springbootapplication @mapperscan("com.example.net.udpservicertest.mapper") @componentscan("com.example.net.udpservicertest") public class udpservicertestapplication { public static void main(string[] args) throws exception { springapplication.run(udpservicertestapplication.class, args); new thread(()->{ try { udpservice udpservice = new udpservice(); udpservice.startsocketserver(); } catch (exception e) { e.printstacktrace(); } }).start(); } }
头疼的问题终于解决了!开心~
springboot 普通类怎么使用注入
需要自定义方法:
package com.example.demo.util; import org.springframework.beans.beansexception; import org.springframework.beans.factory.nosuchbeandefinitionexception; import org.springframework.context.applicationcontext; import org.springframework.context.applicationcontextaware; import org.springframework.stereotype.component; /** * @author mikey * @title: * @description:用于普通类也能使用bean * @email:1625017540@qq.com * @date 2018/12/3 21:57 * @version 1.0 */ @component public class springutil implements applicationcontextaware { private static applicationcontext applicationcontext = null; public springutil() { } public void setapplicationcontext(applicationcontext arg0) throws beansexception { if (applicationcontext == null) { applicationcontext = arg0; } } public static applicationcontext getapplicationcontext() { return applicationcontext; } public static void setappctx(applicationcontext webappctx) { if (webappctx != null) { applicationcontext = webappctx; } } /** * 拿到applicationcontext对象实例后就可以手动获取bean的注入实例对象 */ public static <t> t getbean(class<t> clazz) { return getapplicationcontext().getbean(clazz); } public static <t> t getbean(string name, class<t> clazz) throws classnotfoundexception { return getapplicationcontext().getbean(name, clazz); } public static final object getbean(string beanname) { return getapplicationcontext().getbean(beanname); } public static final object getbean(string beanname, string classname) throws classnotfoundexception { class clz = class.forname(classname); return getapplicationcontext().getbean(beanname, clz.getclass()); } public static boolean containsbean(string name) { return getapplicationcontext().containsbean(name); } public static boolean issingleton(string name) throws nosuchbeandefinitionexception { return getapplicationcontext().issingleton(name); } public static class<?> gettype(string name) throws nosuchbeandefinitionexception { return getapplicationcontext().gettype(name); } public static string[] getaliases(string name) throws nosuchbeandefinitionexception { return getapplicationcontext().getaliases(name); } }
使用:
package com.example.demo.util; import com.example.demo.controller.login.jwtauthenticator; import com.example.demo.dao.userandroleandpermissiondao.hruserdao; import com.example.demo.entity.userandroleandpermission.hruser; import org.apache.shiro.securityutils; import org.apache.shiro.subject.subject; public class methodutils { public hruser finduserbytoken(){ subject subject = securityutils.getsubject(); string token = subject.getprincipal().tostring(); string code = jwtauthenticator.getusername(token); hruserdao hruserdao = springutil.getbean(hruserdao.class);//此处根据类.class来获取bean hruser user = hruserdao.findbycode(code); if(user != null){ return user; }else{ return null; } } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: Python 字典详解
下一篇: 喜茶千万私域营收的运营技巧