欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot 在普通类型注入Service或mapper

程序员文章站 2022-03-10 20:25:56
目录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;
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。