如何用golang仿springioc/aop實現(xiàn)藍圖效果

本篇內(nèi)容主要講解“如何用golang仿spring ioc/aop實現(xiàn)藍圖效果”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何用golang仿spring ioc/aop實現(xiàn)藍圖效果”吧!

創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為新華企業(yè)提供專業(yè)的成都網(wǎng)站設計、成都網(wǎng)站制作,新華網(wǎng)站改版等技術服務。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

Spring

Spring的主要特性:
1. 控制反轉(zhuǎn)(Inversion of Control, IoC)
2. 面向容器
3. 面向切面(AspectOriented Programming, AOP)

源碼gitee地址:
https://gitee.com/ioly/learning.gooop

原文鏈接:
https://my.oschina.net/ioly

目標

  • 參考spring常用注解,使用golang編寫“基于注解的靜態(tài)代碼增強器/生成器”

    • 配置: ComponentScan,Configuration, Bean

    • Bean聲明:Component, Service, Controller

    • Bean注入:Autowried

    • AOP注解:Before, After, Around, PointCut

子目標(Day 4)

  • 前兩天都是在整外圍接口,沒說清楚到底要搞啥

  • 今天以@RestController為例,把項目目標理清楚:

    • 以gin框架為基礎,描述一個訂單CRUD服務

    • 以@RestController為例,手寫增強前后的代碼,描繪如何增強

    • 增強前,應當盡可能簡潔,降低框架侵入性

    • 增強后,與框架很好的結(jié)合,把臟活累活默默干好

設計

  • OrderController: 訂單服務控制器

  • OrderController_Enhanced:增強后的訂單服務控制器

    • 添加SetOrderService方法以便依賴注入

    • 添加xxx_Enhanced方法,以集成到gin框架

    • 添加RegisterRestController方法,以注冊到Bean容器

    • 添加init()方法,以便Bean容器引用

  • IOrderService:訂單持久化服務接口

  • MockOrderService:訂單持久化服務的實現(xiàn),碼略

  • dto/, entity/: 訂單服務的實體類和數(shù)值類,碼略

  • IBeanRegistry:bean注冊表接口

  • IRestController:RESTFul控制器接口

  • IControllerRegistry:RESTFul控制器注冊表及其默認實現(xiàn)

OrderController.go

訂單服務控制器

package controller

import (
	"learning/gooop/spring/demo/order/dto"
	"learning/gooop/spring/demo/order/entity"
	"learning/gooop/spring/demo/order/service"
)

// OrderController handles rest requests for CRUD orders
// @RestController
// @RequestMapping path=/order
type OrderController struct {
	@Autowried
	orderService service.IOrderService
}

// Save create or update an order
// @PostMapping
func (me *OrderController) Save(head *entity.OrderHeadEntity, items []*entity.OrderItemEntity) error {
	return me.orderService.Save(head, items)
}

// View gets order and order items
// @GetMapping
func (me *OrderController) View(orderID int) (error, *dto.OrderDTO) {
	return me.orderService.Get(orderID)
}

// Query query order headers by custom conditions
// @GetMapping
func (me *OrderController) Query(customerID int, statusFlag int, dateFrom string, dateTo string, pageNO int, pageSize int) (error, []*dto.OrderHeadDTO) {
	return me.orderService.Query(customerID, statusFlag, dateFrom, dateTo, pageNO, pageSize)
}

OrderController_Enhanced.go

增強后的訂單服務控制器

  • 添加SetOrderService方法以便依賴注入

  • 添加xxx_Enhanced方法,以集成到gin框架

  • 添加RegisterRestController方法,以注冊到Bean容器

  • 添加init()方法,以便Bean容器引用

package controller

import (
	"github.com/gin-gonic/gin"
	"learning/gooop/spring/demo/framework/bean/controller"
	"learning/gooop/spring/demo/order/dto"
	"learning/gooop/spring/demo/order/entity"
	"learning/gooop/spring/demo/order/service"
	"net/http"
)

// OrderController_Enhanced handles rest requests for CRUD orders
// RestController
// RequestMapping path=/order
type OrderController_Enhanced struct {
	// Autowired
	orderService service.IOrderService
}

// SetOrderService is auto generated setter method for injecting service.IOrderService into me.orderService
func (me *OrderController_Enhanced) SetOrderService(it interface{}) {
	me.orderService = it.(service.IOrderService)
}

// Save create or update an order
// PostMapping
func (me *OrderController_Enhanced) Save(head *entity.OrderHeadEntity, items []*entity.OrderItemEntity) error {
	return me.orderService.Save(head, items)
}

// OrderController_Save_ParamsDTO is auto generated struct for wrapping parameters of OrderController.Save
type OrderController_Save_ParamsDTO struct {
	Order *entity.OrderHeadEntity
	Items []*entity.OrderItemEntity
}

// View_Enhanced is the enhanced version of Save
func (me *OrderController_Enhanced) Save_Enhanced(c *gin.Context) {
	r := new(OrderController_Save_ParamsDTO)
	e := c.BindJSON(r)
	if e != nil {
		c.JSON(http.StatusBadRequest, gin.H{"ok": false, "error": e.Error()})
		return
	}

	e = me.Save(r.Order, r.Items)
	if e != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"ok": false, "error": e.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"ok": true})
}

// View gets order and order items
// GetMapping
func (me *OrderController_Enhanced) View(orderID int) (error, *dto.OrderDTO) {
	return me.orderService.Get(orderID)
}

// View_Enhanced is the enhanced version of View
func (me *OrderController_Enhanced) View_Enhanced(c *gin.Context) {
	id := c.GetInt("id")
	e, d := me.View(id)
	if e != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"ok": false, "error": e.Error()})
	}

	c.JSON(http.StatusOK, d)
}

// Query query order headers by custom conditions
// GetMapping
func (me *OrderController_Enhanced) Query(customerID int, statusFlag int, dateFrom string, dateTo string, pageNO int, pageSize int) (error, []*dto.OrderHeadDTO) {
	return me.orderService.Query(customerID, statusFlag, dateFrom, dateTo, pageNO, pageSize)
}

// OrderController_Query_ParamsDTO is auto generated struct for wrapping parameters of PagedQuery
type OrderController_Query_ParamsDTO struct {
	CustomerID int
	StatusFlag int
	DateFrom   string
	DateTO     string
	PageNO     int
	PageSize   int
}

// Query_Enhanced is the enhanced version of PagedQuery
func (me *OrderController_Enhanced) Query_Enhanced(c *gin.Context) {
	r := new(OrderController_Query_ParamsDTO)
	e := c.Bind(r)
	if e != nil {
		c.JSON(http.StatusBadRequest, gin.H{"ok": false, "error": e.Error()})
		return
	}

	e, d := me.Query(r.CustomerID, r.StatusFlag, r.DateFrom, r.DateTO, r.PageNO, r.PageSize)
	if e != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"ok": false, "error": e.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"ok": true, "data": d})
}

// RegisterRestController is auto generated to implements controller.IRestController interface
func (me *OrderController_Enhanced) RegisterRestController(r *gin.Engine) {
	r.POST("/order/save", me.Save_Enhanced)
	r.GET("/order/view", me.View_Enhanced)
	r.GET("/order/query", me.Query_Enhanced)
}

// init is auto generated to register OrderController_Enhanced into controller.ControllerRegistry
func init() {
	it := new(OrderController_Enhanced)
	controller.ControllerRegistry.Register(it)
}

IOrderService.go

訂單持久化服務接口

package service

import (
	"learning/gooop/spring/demo/order/dto"
	"learning/gooop/spring/demo/order/entity"
)

type IOrderService interface {
	Save(head *entity.OrderHeadEntity, items []*entity.OrderItemEntity) error
	Get(orderID int) (error, *dto.OrderDTO)
	Query(customerID int, statusFlag int, dateFrom string, dateTo string, pageNO int, pageSize int) (error, []*dto.OrderHeadDTO)
}

IBeanRegistry.go

bean注冊表接口

package bean

type IBeanRegistry interface {
	All() []interface{}
}

IRestController.go

RESTFul控制器接口

package controller

import "github.com/gin-gonic/gin"

type IRestController interface {
	RegisterRestController(r *gin.Engine)
}

IControllerRegistry.go

RESTFul控制器注冊表及其默認實現(xiàn)

package controller

import (
	"github.com/gin-gonic/gin"
	"learning/gooop/spring/demo/framework/bean"
	"sync"
)

type IControllerRegistry interface {
	bean.IBeanRegistry

	Register(it IRestController)
	Apply(r *gin.Engine)
}

type tDefaultControllerRegistry struct {
	rwmutex *sync.RWMutex
	items   []IRestController
}

func (me *tDefaultControllerRegistry) All() []interface{} {
	me.rwmutex.RLock()
	defer me.rwmutex.RUnlock()

	all := make([]interface{}, len(me.items))
	for i, it := range me.items {
		all[i] = it
	}
	return all
}

func (me *tDefaultControllerRegistry) Register(it IRestController) {
	me.rwmutex.Lock()
	defer me.rwmutex.Unlock()

	me.items = append(me.items, it)
}

func (me *tDefaultControllerRegistry) Apply(r *gin.Engine) {
	me.rwmutex.RLock()
	defer me.rwmutex.RLock()

	for _, it := range me.items {
		it.RegisterRestController(r)
	}
}

func newDefaultControllerRegistry() IControllerRegistry {
	return &tDefaultControllerRegistry{
		new(sync.RWMutex),
		[]IRestController{},
	}
}

var ControllerRegistry = newDefaultControllerRegistry()

到此,相信大家對“如何用golang仿spring ioc/aop實現(xiàn)藍圖效果”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

網(wǎng)站標題:如何用golang仿springioc/aop實現(xiàn)藍圖效果
網(wǎng)站網(wǎng)址:http://www.muchs.cn/article24/jsooce.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、關鍵詞優(yōu)化、搜索引擎優(yōu)化、云服務器、電子商務、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化