Spring 注解开发-原始注解

📅 2026/8/2 17:37:29
Spring 注解开发-原始注解
1.Spring原始注解Spring是轻代码而重配置的框架配置比较繁重影响开发效率所以注解开发是一种趋势注解代替 xml配置文件可以简化配置提高开发效率。Spring原始注解主要是替代 Bean 的配置。Component :使用在类上用于实例化Bean;Controller :使用web层类上用于实例化Bean;Service :使用在service类上用于实例化Bean;Repository :使用在Dao层上用于实例化Bean;Autowired :使用在字段上用于根据类型依赖注入。Qualifier :结合 Autowired 一起使用用于根据名称进行依赖注入Resource :相当于 AutowiredQualifier,按照名称进行注入。Value :注入普通属性Scope :标注Bean的作用范围PostConstruct:使用在方法上标注该方法是Bean的初始化方法。PreDestroy :使用在方法上标注该方法是Bean的销毁方法。#类实例化。Component 和 Controller Service Repository 这三个是一样的只不过后三个更加具有语义化如果分不清使用哪层就用Component,如果能分清是哪层就用后面三个。#这三个主要用于注入;Autowired :使用在字段上用于根据类型(类)依赖注入。Qualifier :结合 Autowired 一起使用用于根据(bean)名称进行依赖注入Resource :相当于 AutowiredQualifier,按照名称进行注入。使用注解进行开发时需要在 applicationContext.xml中配置组件扫描作用是指定哪个包及其子包下的Bean需要进行扫描以便使用注解配置的类字段和方法。context:component-scan base-packagecom.ycl/context:component-scanapplicationContext.xml ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd !--加载外部配置文件properties-- context:property-placeholder locationclasspath:jdbc.properties/ bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSource property namedriverClass value${jdbc.driver}/property property namejdbcUrl value${jdbc.url}/property property nameuser value${jdbc.username}/property property namepassword value${jdbc.password}/property /bean !--配置组件扫描 扫面这个包及其子包 -- context:component-scan base-packagecom.ycl/context:component-scan /beans package com.ycl.dao; public interface UserDao { public void save(); } package com.ycl.dao.impl; import com.ycl.dao.UserDao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; //bean iduserDao classcom.ycl.dao.impl.UserDaoImpl/bean //Component(userDao) Repository(userDao) //Dao层使用Repository,等同于Component,但是可读性更强; public class UserDaoImpl implements UserDao { public void save(){ System.out.println(save running...); } } package com.ycl.service; public interface UserService { public void save(); } package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.annotation.Resource; //bean iduserService classcom.ycl.service.impl.UserServiceImpl //Component(userService) Service(userService) //等同于Component,放在service层更具有可读性。 public class UserServiceImpl implements UserService { //property nameuserDao refuserDao/property //Autowired //字段注入 //按照数据类型从Spring容器中进行匹配。如果spring中只有一个userDao类型的Bean,省略 Qualifier也可以。 //但是如果spring中有多个userDao类型的bean; //Qualifier(userDao) //写入要注入的bean的id;这两句话相当于上面Bean的注入。 //Qualifier是按照id值从容器中进行匹配的。但是此处Qualifier要集合Autowired一起使用。 Resource(nameuserDao) //Resource 相当于 QualifierAutowired; //如果你使用的是 JDK 9 及以上包括 11、17javax.annotation 包默认被移出了标准库。你需要手动引入依赖才能使用 private UserDao userDao; //如果是xml配置的方式注入那么这个set方法是一定要写的。如果是使用注解的方式set方法可以省略不写; // public void setUserDao(UserDao userDao) { // this.userDao userDao; // } public void save() { userDao.save(); } } pom.xml project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd modelVersion4.0.0/modelVersion groupIdorg.example/groupId artifactIdspring_05/artifactId packagingwar/packaging version1.0-SNAPSHOT/version namespring_05 Maven Webapp/name urlhttp://maven.apache.org/url build finalNamespring_05/finalName plugins /plugins /build dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.32/version /dependency dependency groupIdc3p0/groupId artifactIdc3p0/artifactId version0.9.1.2/version /dependency dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.1.10/version /dependency dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.0.5.RELEASE/version /dependency dependency groupIdjavax.annotation/groupId artifactIdjavax.annotation-api/artifactId version1.3.2/version /dependency /dependencies /project #Value注解 从容器中找相关属性值。 package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.annotation.Resource; Service(userService) //等同于Component,放在service层更具有可读性。 public class UserServiceImpl implements UserService { Value(itcat) private String driver; Resource(nameuserDao) private UserDao userDao; public void save() { System.out.println(driver); userDao.save(); } } package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.annotation.Resource; Service(userService) //等同于Component,放在service层更具有可读性。 public class UserServiceImpl implements UserService { Value(${jdbc.driver}) private String driver; Resource(nameuserDao) private UserDao userDao; public void save() { System.out.println(driver); userDao.save(); } } #Scope单例还多例。 package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.annotation.Resource; Service(userService) //等同于Component,放在service层更具有可读性。 Scope(prototype) //多例 //Scope(singleton)//单例 public class UserServiceImpl implements UserService { Value(${jdbc.driver}) private String driver; Resource(nameuserDao) private UserDao userDao; public void save() { System.out.println(driver); userDao.save(); } } #PostConstruct 和 PreDestroy package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; Service(userService) //等同于Component,放在service层更具有可读性。 Scope(prototype) //多例 //Scope(singleton)//单例 public class UserServiceImpl implements UserService { Value(${jdbc.driver}) private String driver; Resource(nameuserDao) private UserDao userDao; public void save() { System.out.println(driver); userDao.save(); } PostConstruct //构造器之后 public void init(){ System.out.println(Service对象的初始化方法); } PreDestroy public void destroy(){ System.out.println(Service对象的销毁方法); } } 一般 PreDestroy 不会被执行。 要想让它执行: package com.ycl.web; import com.ycl.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserController { public static void main(String[] args) { ApplicationContext app new ClassPathXmlApplicationContext(applicationContext.xml); UserService userService app.getBean(UserService.class); userService.save(); } } 需要将上述代码修改为: package com.ycl.web; import com.ycl.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserController { public static void main(String[] args) { ClassPathXmlApplicationContext app new ClassPathXmlApplicationContext(applicationContext.xml); UserService userService app.getBean(UserService.class); userService.save(); app.close(); //手动关闭容器就可以看到销毁方法被执行。 } }