Java开发中的注解技术

42、Java开发中的EJB、事务、注解及相关技术详解 本文深入探讨了Java企业级开发中的关键技术,包括EJB的发展与特性、事务的管理机制、注解的使用方法、应用集成方式、性能优化策略、安全控制手段以及实体持久化、消息驱动Bean和会话Bean等内容。同时,还介绍了命名与目录服务(JNDI)的应用及测试与调试的最佳实践,为企业级Java开发者提供全面的技术指导和参考。 阅读详情


概述



   

注解与注释,

        注解,告诉编译器如何运行程序!

        注释,给程序员阅读,对编译、运行没有影响;

 

注解作用,

        1.告诉编译器如何运行程序;

        2.简化(取代)配置文件  

常用的注解如下:




        

//重写父类的方法

   @Override

   public String toString() {

      returnsuper.toString();

   }

   

   //抑制编译器警告

   @SuppressWarnings({"unused","unchecked"})

   privatevoid save() {

       List list =null;

   }

   

   //标记方法以及过时

   @Deprecated

   privatevoidsave1() {

   }



元注解:表示注解的注解

   

指定注解的可用范围:


    

@Target({


TYPE,    类


FIELD,    字段


METHOD, 方法


PARAMETER,  参数


CONSTRUCTOR,构造器


 LOCAL_VARIABLE 局部变量


})



元注解 - 2.指定注解的声明周期


@Retention(RetentionPolicy.SOURCE)   注解只在源码级别有效


@Retention(RetentionPolicy.CLASS)     注解在字节码即别有效 默认值


@Retention(RetentionPolicy.RUNTIME)  注解在运行时期有效


    注解案例之优化BaseDao的代码

一、创建Bean实体类

           

package cn.sp.utils;
@Table(tableName="admin")
public class Admin2 {
		@ID
		@Column(columnName="id")
		private int id2;
		
		@Column(columnName="userName")
		private String userName2;
		
		@Column(columnName="pwd")
		private String pwd2;
		public int getId2() {
			return id2;
		}
		public void setId2(int id2) {
			this.id2 = id2;
		}
		public String getUserName2() {
			return userName2;
		}
		public void setUserName2(String userName2) {
			this.userName2 = userName2;
		}
		public String getPwd2() {
			return pwd2;
		}
		public void setPwd2(String pwd2) {
			this.pwd2 = pwd2;
		}
		@Override
		public String toString() {
			return "Admin2 [id2=" + id2 + ", userName2=" + userName2 + ", pwd2=" + pwd2 + "]";
		}
		
		
}

二、创建注解类


                    




package cn.sp.utils;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.ResultSetHandler;

import cn.sp.dao.JdbcUtil;

public class BaseDao_2 <T>{
		private 	Class<T> clazz;
		private String tableName;	
		private String id_primary;
	
		public BaseDao_2() {
			Type type=this.getClass().getGenericSuperclass();
			ParameterizedType pt=(ParameterizedType) type;
			Type[] types = pt.getActualTypeArguments();
			clazz=(Class<T>) types[0];
			/*******获取表名******/
			Table table = clazz.getAnnotation(Table.class);
			tableName = table.tableName();
			//已经拿到Admin2.class
			//获取当前运行类的所有字段,遍历。获取每一个字段上的id注解
			Field[] fs = clazz.getDeclaredFields();
			for (Field field : fs) {
				//设置强制访问
				field.setAccessible(true);
				//获取每一个字段上的ID注解
				ID anno_id = field.getAnnotation(ID.class);
				//判断
				if(anno_id!=null){
					//如果当前字段有ID注解,说明是主键,再获取字段名称
					Column column = field.getAnnotation(Column.class);
					//主键
					id_primary=column.columnName();
					break;
				}
			}
			System.out.println("表:"+tableName);
			System.out.println("主键:"+id_primary);
		}
		public T findById(int id){
			try {
				String sql="select * from "+tableName+" where id=?";
				return	JdbcUtil.getQueryRunner().query(sql, new MyBeanHandler<T>(clazz),id);
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		public List<T> getAll(){
			try {
				String sql="select * from "+tableName;
				return	JdbcUtil.getQueryRunner().query(sql, new MyBeanListHandler<T>(clazz));
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
}

/**
 * 自定义结果集封装单个Bean对象
 */
class MyBeanHandler<T> implements ResultSetHandler<T>{
	private Class<T> clazz;
	
	public MyBeanHandler(Class<T> clazz) {
		this.clazz=clazz;
	}

	@Override
	public T handle(ResultSet rs) throws SQLException {
	try {
		T t=clazz.newInstance();
		if(rs.next()){
			Field[] fs = clazz.getDeclaredFields();
			for (Field f : fs) {
				String fieldName=f.getName();
				Column column = f.getAnnotation(Column.class);
				String columnName=column.columnName();
				Object columnValue=rs.getObject(columnName);
				//设置 BeanUtils组件
				BeanUtils.copyProperty(t, fieldName, columnValue);
			}
		}
		return t;
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
	}

	
	

}
	

/**自定义结果集封装多个Bean对象
 */

class MyBeanListHandler<T>  implements ResultSetHandler<List<T>>{
private Class<T> clazz;
	
	public MyBeanListHandler(Class<T> clazz) {
		this.clazz=clazz;
	}
	public List<T> handle(ResultSet rs) throws SQLException {
					ArrayList<T> list = new ArrayList<T>();
					
					try {
						while(rs.next()){
							T t=clazz.newInstance();
						
							Field[] fs = clazz.getDeclaredFields();
							for (Field f : fs) {
								String fieldName=f.getName();
								Column column = f.getAnnotation(Column.class);
								String columnName=column.columnName();
								Object columnValue=rs.getObject(columnName);
								//设置 BeanUtils组件
								BeanUtils.copyProperty(t, fieldName, columnValue);
							}
							list.add(t);
						}
						return list;
					} catch (Exception e) {
						throw new RuntimeException(e);
					}
		}
	
}

创建类AdminDao2(用于测试执行)

package cn.sp.utils;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;

public class AdminDao2 extends BaseDao_2<Admin2> {
	@Test
	public void testName() throws Exception {
		AdminDao2 dao2 = new AdminDao2();
		Admin2 ad2 = dao2.findById(1);
		List<Admin2> list = dao2.getAll();
		System.out.println(ad2);
		System.out.println(list);
	}
}


相关注解代码:

package cn.sp.utils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 用于描述主键
 * @author Administrator
 *
 */
@Retention(RetentionPolicy.RUNTIME)  // 指定注解在运行时期有效
public @interface ID {

}
package cn.sp.utils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)  // 指定注解在运行时期有效
public @interface Table {
			String tableName();
}

package cn.sp.utils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)  // 指定注解在运行时期有效
public @interface Column {
	String columnName();
}

注意:一定要在注解上加元注解@Retention(RetentionPolicy.RUNTIME),否则运行时注解失效,会报空指针异常!






eclipse配置Java代码注释模板 eclipse配置Java代码注释模板,Window -> Preferences -> Java -> Code Style -> Code Templates,点击import导入注释模板,勾选Automatically add comments for new methods and types,选择Comments和Code中的注释类型,点击Edit修改注释样式 立即下载

相关推荐

java注释统计工具

自己做得java项目注释统计工具,可统计代码行数,注释行数,能统计各种注释样式,能看统计详细情况,能生成报表,可自由控制合格率!算法高效!

mybatis-plus 常见3个注解:@TableName、@TableField、@TableId

描述:表名注解作用:指定当前实体类映射哪张数据库表, 默认是跟实体类名一致错误提示:如果@TableName声明的表名跟数据库中的表名不一致会报错,sql语句去查yy_employee,但是数据库中的是employee 描述:字段注解(非主键)作用:指定当前属性映射数据库表哪一列, 默认是跟属性名一致描述:主键注解作用:标记当前属性映射表主键。前言:项目类型为spring initializr、数据库要有数据、运行CRUDTest.java...

weixin_54348877的博客 6737

3D打印切片软件Cura及CuraEngine原理分析

引言         年初开始进入3D打印行业,受命以Cura为基础,研发一款自主的3D打印切片软件。         自主研发要取其长处,补其不足,首先自然是要搞清楚Cura到底做了什么,读Cura的代码是必需的。我一向都觉得比起自己写代码来,读别人的代码是一个漫又而痛苦的过程,读者的思想与写者总有偏差,往往又无法验证自己的猜想是否正确,只叹人脑不是电脑,无法把眼前的代码从头到尾执行一遍...

AiDiShengDeXiaoWu的博客 4420

Java面向对象 异常

Java面向对象 异常

weixin_66108142的博客 587

iTunes登录协议抓包实战:绕过反检测与TLS解密的完整方案

在软件逆向与网络协议分析中,抓包工具扮演着关键角色。代理型工具如Fiddler通过修改系统代理实现HTTPS解密,而驱动型工具如HTTPDebugger则注入进程钩取网络API,但这些实现机制往往会被具有反检测策略的客户端识别。以iTunes登录协议为例,其内置证书锁定、进程完整性与系统代理检测等防护,导致常规抓包方案失效。从工具原理出发,对比不同抓包方案的暴露面,重点介绍如何利用Fiddler通过中间人代理获取明文流量,以及使用Wireshark进行被动监听规避检测的进阶技巧,并总结常见问题排查经验,为分

weixin_28607671的博客 366

实测有效!YOLOv8融合EMA注意力机制后,在无人机航拍目标检测中的性能提升对比

本文详细介绍了YOLOv8融合EMA注意力机制在无人机航拍目标检测中的性能提升效果。通过多尺度特征融合和通道-空间双重注意力机制,EMA模块显著提升了小目标检测的准确率,mAP@0.5平均提升4.2%,同时保持推理速度基本不变。文章还提供了模型定制、训练技巧和实际部署优化的全流程指南。

weixin_33704234的博客 391

8.spring系列- java注解

问题 注解是干什么的? 一个注解可以使用多次吗?如何使用? @Inherited是做什么的? @Target中的TYPE_PARAMETER和TYPE_USER用在什么地方? 泛型中如何使用注解? 注解定义可以实现继承吗? spring对注解有哪些增强?@Aliasfor注解是干什么的? 什么是注解 代码中注释大家都熟悉吧,注释是给开发者看的,可以提升代码的可读性和可维护性,但是对于java编译器和虚拟机来说是没有意义的,编译之后的字节码文件中是没有注释信息的;而注解和注释有点类似,唯一的区别就是注释是

qq_32062699的博客 2665

海康威视国内版监控设备改英文界面难题:原因解析与解决方案

跨境安防设备部署中,国内采购的海康威视监控设备常因仅支持中文界面导致海外用户无法操作。本文剖析了该问题的核心原因:海康威视对国内版和海外版设备实行区域锁定策略,国内版固件仅内置中文且无法通过常规方式切换语言。针对此问题,文章提供了三种解决方案:1)官方合规的海外版固件更换;2)低成本的操作界面翻译与远程协助;3)长期更换海外版设备的彻底解决方案。同时给出了跨境采购的注意事项,强调应提前确认设备版本、拒绝非官方改造并预留适配时间。

海康威视技术支持 3952

使用注解反射与代码生成技术:Java开发中的选择与权衡

在Java开发中,我们经常需要选择合适的技术来实现特定的功能。两种常见的方法是使用,以及。这两种方法各有优缺点,适用于不同的场景。本文将详细讨论它们的特点、应用场景,以及如何根据项目需求做出最佳选择。

nbsaas-boot基于Request-Response的企业级快速开发框架 1338

使用 Simulink + Simscape Electrical 对基于VSG控制的背靠背变流器整流侧进行建模与仿真

本文介绍了基于Simulink的直驱风电系统背靠背变流器整流侧虚拟同步发电机(VSG)建模方法。首先阐述了直驱风电系统结构和VSG控制的作用,然后详细指导了模型搭建过程:从创建项目、添加PMSG和变流器模块,到搭建主电路拓扑和实现VSG控制逻辑。重点说明了VSG控制器如何模拟传统同步发电机的特性,并提供了仿真设置和结果分析方法。该模型可用于研究风电系统在不同工况下的响应特性,为新能源发电系统设计提供重要参考。

amy_mhd的博客 180

5GS 协议栈 — PFCP 协议 — URR 用量上报规则

目录 文章目录目录URR 用量上报规则UEE 的参数Usage Report 的参数示例 URR 用量上报规则 29244 5.2.2 Usage Reporting Rule URR 的作用? 用来告诉 UPF 如何对 PDR 识别的 SDF 或 Application 业务进行使用量统计信息的上报。CP 收到 Report Information 后,可用于计费或者管控(e.g. 超量限速)等用途。 URR 在哪个流程里下发的? N4 会话建立流程。 N4 会话修改流程。 URR 是怎么工作

烟云的计算 4589

探索【注解】、【反射】、【动态代理】,深入掌握高级 Java 开发技术

本文将带领读者深入了解 Spring 框架中的关键技术:注解、反射和动态代理。注解作为一种元数据,大幅简化了 Spring 应用程序的配置和管理。反射机制赋予了程序在运行时动态获取和操作类信息的能力,为 Spring 提供了高度灵活性。而动态代理则是 Spring AOP 的基础,通过代理模式实现了横切关注点的管理。本文旨在帮助读者深入理解这些关键概念,提升其对 Spring 框架的掌握程度,从而更加熟练地运用 Java 开发技术。

q1372302825的博客 1938

【知识分享】IBIS 建模指南 05

本文详细阐述了IBIS模型创建过程中的关键技术和数据规范要求。主要内容包括:1. 数据完整性检查要点,强调I-V和V-T数据必须覆盖所有工艺角且匹配;2. 数据限制处理方法,介绍100/1000点限制下的两种数据筛选算法;3. 特殊数据处理技术,包括内部终端电阻调整和V-T表时间窗口选择;4. 高级关键字应用,涵盖[ModelSelector]、[Sub model]、[DiffPin]等复杂功能实现方法;5. 预加重缓冲器等特殊结构的建模方案。

一只豌豆象的博客 1594

java 注解开发_Java后端精选技术:Java注解详解

在使用SpringBoot作为Web敏捷开发的框架之后,SpringBoot除了自动装配配置的便捷之外,在很多时候需要基于注解来开发。注解不仅增加了代码的可读性,还增加了开发的速度。这篇文章主要讲述Java 注解。元注解元注解用于注解其他注解的。Java 5.0定义了4个标准的元注解,如下:@Target@Retention@DocumentedInherited现在来说说这四个元注解有什么作用。...

weixin_39667398的博客 80

学Simulink--基于多物理场耦合与系统集成的储能系统场景实例:压缩空气储能(CAES)系统的热力学建模与效率分析

本文提供了一个基于Simulink的压缩空气储能(CAES)系统热力学建模教程。通过多物理场耦合方法,详细演示了从系统架构设计到仿真测试的全过程,包括多级压缩机/膨胀机系统搭建、显热蓄热系统设计以及效率分析。文章重点强调了热管理对提升CAES效率的关键作用,并给出了68%电-电效率的优化案例。最后提出了变工况建模、不同蓄热介质对比等高级优化方向,为开发零碳大容量储能系统提供了实用工具和方法。

amy_mhd的博客 130

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java开发笔记(八十三)利用注解技术检查空指针

注解属于比较高级的Java开发技术,前面介绍的内置注解专用于编译器检查代码,另外一些注解则由各大框架定义与调用,像Web开发常见的Spring框架、Mybatis框架,Android开发常见的ButterKnife框架等等,都使用了大量的注解。为了更好地弄清注解的应用原理,接下来不妨尝试自定义注解,并在实际开发中对自定义的注解加以运用。之前介绍异常预防的时候,为了避免出现空指针异常,可谓是八仙过海...

weixin_30362083的博客 168

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 注解开发_Java开发技术栈:Java基础语法(四)反射、注解

Java反射定义​ Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。用途​ 通过反射,Java 代码可以发现有关已加载类的字段,方法和构造函数的信息,并可以在安全限制内对这些字段,方法和构造函数进行操作。​ 很多人都认为反射在实际Java中开发应用...

weixin_39662611的博客 103

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【深入剖析Java】「重塑技术功底」攻破Java技术盲点之剖析注解技术的实现原理和开发指南

Annotation(注解)是在JDK 5.0及更高版本中引入的强大工具。它不仅可用于创建文档,还能跟踪代码中的依赖关系,甚至在编译时执行基本检查。从某些角度来看,annotation与修饰符的使用方式相似,可以应用于包、类、构造方法、方法、成员变量、参数和本地变量的声明中。这些信息被存储在Annotation的“name=value”结构中,使得代码更加清晰、易于维护,并提高了可读性。@Mapping。

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 1251

Java接口开发中误用Swagger @RequestBody注解的技术总结与反思

在近期参与的Spring Boot后端系统开发中,我负责设计并实现了一组RESTful API接口。这些接口需要接收前端发送的JSON格式数据,并按照项目要求提供清晰的可视化API文档。在这样的技术需求背景下,我同时引入了Spring框架用于请求体处理与Swagger用于API文档化。然而,在开发过程中,我犯了一个难以察觉但影响严重的错误——错误地导入了Swagger的注解而非Spring的注解,导致接口无法正确解析请求体数据,经过数小时的排查才最终定位到问题所在。具体来说,我在控制器方法中误将。

m0_73836628的博客 673

java高级开发技术,Spring注解驱动(1)

注解 | 说明 | 备注 || @Before | 在目标方法执行之前通知 | || @After | 在目标方法执行之后通知 | || @AfterRturning | 在目标方法执行正常返回后通知 | || @AfterThrowing | 在目标方法执行出现异常后通知 | || @Around | 环绕通知 | || @PointCut | 定义切点 | || @EnableAspectJAutoProxy | 开启切面支持 | |

2401_84413420的博客 772

java框架开发技术篇5---Hibernate注解

Hibernate注解 为了方便开发,减少配置文件,在hibernate2.0之后引入了注解进行配置元数据。使用注解会破坏java的封装的原则,但是减少开发的工作量。 1. 类上的注解 注解 说明 @Entity 代表该类是一个实体类(导javax下的),必须写 @Table(name=“表名”) 配置该实体类所映射的表;name: 用来指定表名,如果不指定表名,也可以省略,则生成的表名默认为类名 例如 @Entity //只要用来表明当前的类是一个实体类 @Table(nam

一席之地 162

JAVA注解

JAVA注解

Oozie123的博客 958

注解开发的使用

注解开发的使用

NJUSTZJC的博客 340

Java注解总结(1)

所谓注解,其实是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行 相应的处理。通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。二、基本Annotation@Override就是用来指定方法覆载的,它可以强制一个子类必须覆盖父类的方法。@Deprecated用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将会给出警告。

2401_83817916的博客 324

2.Spring注解开发之Spring新注解

2.Spring注解开发 2.2Spring新注解

qq_41512308的博客 140
上一篇: 泛型&反射
下一篇: log4j日志组件
2YSP
博客等级 码龄10年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值