详解Spring框架注解的用法代码实例
写在前面:
众所周知,在JavaEE开发框架中,Spring框架是用的最多的,注解在框架的定位也就越来越明显了。说句玩笑话:能用一个注解解决的,绝不用一堆配置和代码解决;如果不能解决,那么来两个注解;(稳住,别喷…)
1.@Component是Spring定义的一个通用注解,可以注解任何bean。
2.@Scope定义bean的作用域,其默认作用域是”singleton”,除此之外还有prototype,request,session和global session。
案例:@Component和@Scope用法分析:
BeanAnnotation类:
@Scope @Component public class BeanAnnotation { public void say(String arg) { System.out.println("BeanAnnotation : " + arg); } public void myHashCode() { System.out.println("BeanAnnotation : " + this.hashCode()); } }
junit4测试类→TestBeanAnnotation类:
@RunWith(BlockJUnit4ClassRunner.class) public class TestBeanAnnotation extends UnitTestBase { public TestBeanAnnotation() { super("classpath*:spring-beanannotation.xml"); } @Test public void testSay() { BeanAnnotation bean = super.getBean("beanAnnotation"); bean.say("This is test."); } @Test public void testScpoe() { BeanAnnotation bean = super.getBean("beanAnnotation"); bean.myHashCode(); bean = super.getBean("beanAnnotation"); bean.myHashCode(); } }
Spring配置文件→spring-beanannotation.xml:
<context:component-scan base-package="com.beanannotation"></context:component-scan>
我们先从Spring配置文件分析,base-package="com.beanannotation"
说明我们只处理这个包名下面的注解。
然后分析BeanAnnotation类,有一个say的方法。假设我们不清楚这是一个什么类型(注:Service或者DAO)的类,我们可以用一个通用的注解@Component。
最后分析TestBeanAnnotation类,testSay方法里super.getBean("beanAnnotation")
是从IOC的容器中取到这个bean,并调用bean的say方法。
提出问题的时间到了,当我们super.getBean的时候是通过bean的id从IOC容器中获取的,那么这个id是什么呢?因为在我们添加@Component到BeanAnnotation类上的时候,默认的id为beanAnnotation。如果指定了@Component的名称,譬如指定为@Component(”bean”)
的时候,在单元测试的时候就必须把super.getBean得到的id与之相对应才能测试成功。
在这里我把@Scope注解单独分离出来分析,在TestBeanAnnotation类里面有一个testScpoe方法。在BeanAnnotation类里面有一个myHashCode方法,可能大家有些疑惑,为什么要用this.hashCode()?因为@Scope指定的是bean的作用域,为了保证测试类的结果准确明了,所以采用哈希码值来判断是否为同一个对象。
3.@Repository、@Service、@Controller是更具有针对性的注解。
PS:这里我们需要明白这三个注解是基于@Component定义的注解哦:
①、@Repository通常用于注解DAO类,也就是我们常说的持久层。
②、@Service通常用于注解Service类,也就是服务层。
③、@Controller通常用于Controller类,也就是控制层(MVC)。
4.@Autowired理解为“传统”的setter方法,可以用在setter方法上,也可以用在构造器或者成员变量,能够进行Spring Bean的自动装配。
案例:@Autowired用法分析一:
Spring配置文件→spring-beanannotation.xml:
<context:component-scan base-package="com.beanannotation"></context:component-scan>
SimpleMovieLister类:
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired(required=false) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
在默认的情况下,如果找不到合适的bean将会导致autowiring失败抛出异常,我们可以将@Autowired注解在这个set方法上,标记required=false来避免。但是,这不是一个必须的,如果找不到movieFinder的实例,是不会抛出异常的,只有在使用的时候发现movieFinder为null,在这种情况下,就要求我们在使用的时候,首先判断movieFinder是不是为null,如果是就会报空指针异常 。
值得注意的是,我们知道每个类可以有很多个构造器,但是在使用@Autowired的时候,有且只能有一个构造器能够被标记为required=true(注:required的默认值为false)。
案例:@Autowired用法分析二:
BeanImplOne类:
@Order @Component public class BeanImplOne implements BeanInterface { }
BeanImplTwo类:
@Order @Component public class BeanImplTwo implements BeanInterface { }
BeanInterface类:
public interface BeanInterface { }
BeanInvoker类:
@Component public class BeanInvoker { @Autowired private List<BeanInterface> list; @Autowired private Map<String, BeanInterface> map; public void say() { if (null != list && 0 != list.size()) { for (BeanInterface bean : list) { System.out.println(bean.getClass().getName()); } } else { System.out.println(" list is null !"); } if (null != map && 0 != map.size()) { for (Map.Entry<String, BeanInterface> entry : map.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue().getClass().getName()); } } else { System.out.println("map is null !"); } } }
测试类TestInjection:
@RunWith(BlockJUnit4ClassRunner.class) public class TestInjection extends UnitTestBase { public TestInjection() { super("classpath:spring-beanannotation.xml"); } @Test public void testMultiBean() { BeanInvoker invoker = super.getBean("beanInvoker"); invoker.say(); } }
首先,我们清楚BeanImplOne类和BeanImplTwo类是实现了BeanInterface接口的,在BeanInvoker类里面我们定义了list和map,我们通过@Autowired注解把BeanImplOne类和BeanImplTwo类注解进入其中。那么怎么证实是@Autowired注解把这两个类注入到list或者map中的呢?那么请看if循环语句和foreach循环打印,通过这个逻辑判断,如果能够打印出BeanImplOne类和BeanImplTwo类的路径名,就说明这样是可以的。如果有些小伙伴可能不信,那么可以试着不使用@Autowired注解,看结果怎么样。
测试类没有什么好说的,各位小伙伴有没有注意到@Order注解呢?这里需要解释的就是,如果在@Order注解里面输入执行的数字,比如1或者2,那么打印出来的路径名就会按顺序,也就是说通过指定@Order注解的内容可以实现优先级的功能。
5.@ImportResource注解引入一个资源,对应一个xml文件
6.@Value注解从资源文件中,取出它的key并赋值给当前类的成员变量
案例:@ImportResource和@Value用法分析:
MyDriverManager类:
public class MyDriverManager { public MyDriverManager(String url, String userName, String password) { System.out.println("url : " + url); System.out.println("userName: " + userName); System.out.println("password: " + password); } }
config.xml:
<context:property-placeholder location="classpath:/config.properties"/>
StoreConfig类:
@Configuration @ImportResource("classpath:config.xml") public class StoreConfig { @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean public MyDriverManager myDriverManager() { return new MyDriverManager(url, username, password); }
这个案例我们使用注解配置jdbc数据库的连接,首先创建一个内含构造器的MyDriverManager类,然后配置config.xml里面的资源文件路径,以便@ImportResource注解获取,最后配置StoreConfig类。(注意url、username、password也必须要和数据库的保持一致哦)
详解StoreConfig类:首先我们定义三个成员变量,然后给每一个成员变量打上一个@value注解,注意@value里面的内容一定是资源文件里面的key值。这里的@ImportResource注解就是指明一个资源文件,在这个资源文件里面获取到对应的数据。那么@Configuration注解是用来干嘛的呢?为什么不用@Component注解呢?其实是这样的,@Component注解用于将所标注的类加载到 Spring 环境中,这时候是需要配置component-scan才能使用的,而@Configuration注解是Spring 3.X后提供的注解,它用于取代XML来配置 Spring。
7.@Bean注解用来标识配置和初始化一个由SpringIOC容器管理的新对象的方法,类似XML中配置文件的
ps:默认的@Bean注解是单例的,那么有什么方式可以指定它的范围呢?所以这里才出现了@Scope注解
8.@Scope注解,在@Scope注解里面value的范围和Bean的作用域是通用的,proxyMode的属性是采用哪一种的单例方式(一种是基于接口的注解,一种是基于类的代理)
案例:@Bean和@Scope用法分析:
@Bean @Scope(value ="session",proxyMode = "scopedProxyMode.TARGET_CLASS") public UserPreferences userPreferences(){ return new userPreferences(); } @Bean public service userService(){ UserService service =new SimpleUserService(); service.setUserPreferences(userPreferences); return service; }
Atas ialah kandungan terperinci 详解Spring框架注解的用法代码实例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Pada tahun 2023, teknologi AI telah menjadi topik hangat dan memberi impak besar kepada pelbagai industri, terutamanya dalam bidang pengaturcaraan. Orang ramai semakin menyedari kepentingan teknologi AI, dan komuniti Spring tidak terkecuali. Dengan kemajuan berterusan teknologi GenAI (General Artificial Intelligence), ia menjadi penting dan mendesak untuk memudahkan penciptaan aplikasi dengan fungsi AI. Dengan latar belakang ini, "SpringAI" muncul, bertujuan untuk memudahkan proses membangunkan aplikasi berfungsi AI, menjadikannya mudah dan intuitif serta mengelakkan kerumitan yang tidak perlu. Melalui "SpringAI", pembangun boleh membina aplikasi dengan lebih mudah dengan fungsi AI, menjadikannya lebih mudah untuk digunakan dan dikendalikan.

Sebagai peneraju industri, Spring+AI menyediakan penyelesaian terkemuka untuk pelbagai industri melalui API yang berkuasa, fleksibel dan fungsi lanjutannya. Dalam topik ini, kami akan menyelidiki contoh aplikasi Spring+AI dalam pelbagai bidang Setiap kes akan menunjukkan cara Spring+AI memenuhi keperluan khusus, mencapai matlamat dan meluaskan LESSONSLEARNED ini kepada rangkaian aplikasi yang lebih luas. Saya harap topik ini dapat memberi inspirasi kepada anda untuk memahami dan menggunakan kemungkinan Spring+AI yang tidak terhingga dengan lebih mendalam. Rangka kerja Spring mempunyai sejarah lebih daripada 20 tahun dalam bidang pembangunan perisian, dan sudah 10 tahun sejak versi Spring Boot 1.0 dikeluarkan. Sekarang, tiada siapa boleh mempertikaikan Spring itu

Cara melaksanakan transaksi terprogram musim bunga: 1. Gunakan TransactionTemplate 2. Gunakan TransactionCallback dan TransactionCallbackWithoutResult 3. Gunakan anotasi Transaksional;

Anotasi dalam rangka kerja JUnit digunakan untuk mengisytiharkan dan mengkonfigurasi kaedah ujian Anotasi utama termasuk: @Ujian (pengisytiharan kaedah ujian), @Sebelum (kaedah dijalankan sebelum kaedah ujian dilaksanakan), @Selepas (kaedah dijalankan selepas kaedah ujian. dilaksanakan), @ BeforeClass (kaedah yang dijalankan sebelum semua kaedah ujian dilaksanakan), @AfterClass (kaedah yang dijalankan selepas semua kaedah ujian dilaksanakan), anotasi ini membantu mengatur dan memudahkan kod ujian dan meningkatkan kebolehpercayaan kod ujian dengan menyediakan niat dan konfigurasi yang jelas.

Pengenalan: PHPDoc ialah standard ulasan untuk kod PHP yang menghasilkan dokumentasi yang mudah difahami dan bermaklumat. Dengan menggunakan tag ulasan khusus, PHPDoc membenarkan pembangun memberikan butiran penting tentang fungsi, kelas, kaedah dan elemen kod lain. Panduan lanjutan ini melihat secara mendalam pada PHPDoc, menunjukkan keupayaannya dan menyediakan strategi dokumentasi yang berkesan. Sintaks dan teg: Komen PHPDoc bermula dengan garis miring berganda (//) atau komen berbilang baris (/**/). Berikut ialah beberapa teg anotasi biasa: @param: Mentakrifkan parameter fungsi atau kaedah. @return: Menentukan nilai pulangan fungsi atau kaedah. @throws: Menerangkan pengecualian yang mungkin dilemparkan oleh fungsi atau kaedah. @var: mentakrifkan atribut atau kejadian kelas

Anotasi dalam perpustakaan Jackson mengawal pensirilan dan penyahserilangan JSON: Pensirilan: @JsonIgnore: Abaikan harta @JsonProperty: Tentukan nama @JsonGetter: Gunakan kaedah get @JsonSetter: Gunakan kaedah yang ditetapkan Deserialization: @JsonIgnoreProperties: Abaikan harta @ JsonProperty: Nyatakan nama @JsonCreator: Gunakan pembina @JsonDeserialize: Logik tersuai

Cara menetapkan tahap pengasingan transaksi dalam Spring: 1. Gunakan anotasi @Transactional 2. Tetapkan dalam fail konfigurasi Spring 3. Gunakan PlatformTransactionManager 4. Tetapkan dalam kelas konfigurasi Java. Pengenalan terperinci: 1. Gunakan anotasi @Transactional, tambah anotasi @Transactional pada kelas atau kaedah yang memerlukan pengurusan transaksi dan tetapkan tahap pengasingan dalam atribut 2. Dalam fail konfigurasi Spring, dsb.

Pengenalan terperinci kepada penggunaan SQL MyBatis anotasi dinamik MyBatis ialah rangka kerja lapisan kegigihan yang memberikan kami operasi kegigihan yang mudah. Dalam pembangunan sebenar, biasanya diperlukan untuk menjana pernyataan SQL secara dinamik berdasarkan keperluan perniagaan untuk mencapai operasi data yang fleksibel. SQL dinamik anotasi MyBatis direka untuk memenuhi permintaan ini.
