Spring完全注解开发
注解的好处:如果管理很多的Bean,要求这些Bean都配置在applocationContext.xml文件中。用了注解之后,就不需要在xml文件中配置了,Spring提供了几个辅助类会自动扫描和装配这些Bean。所以大大减少了xml文件的体积,Spring会根据配置去扫描某些包里面的类,得到类的方法或注解,不同的注解会进行不同的操作。
这个注解一般的来说,用在类上面,加上这个注解的类可以成为一个spring的xml配置文件,使用的是java代码的配置
//配置Spring装载类 //Configurable 指定此类为Spring配置类。作为配置类,替代XML配置文件 //ComponentScan 指定Bean范围(注解范围),扫描装载 @Configurable @ComponentScan(basePackages = {"com.minelsh"}) public class springConfig { }
创建对象的注解
Spring中作用在作用类上的注解有@Component注解和三个衍生注解:@Responsity @Service和@Controller
三个衍生注解的说明:
@Controller:通常用于Controller类,也就是控制层(MVC)。
@Service:通常用于Service类,也就是服务层。
@Repository:通常用于DAO类,也就是持久层。
当注解在作用类上时,表明这些类似交给Spring容器进行管理的。
@Component注解的使用
@Component("conversionImpl") //其实默认的spring中的Bean id 为 conversionImpl(首字母小写) public class ConversionImpl implements Conversion { }
案例1:
不指定bean的名称,默认为类名首写小写字母
@Component public class University { to do sthing... }
获取bean方式:
ApplicationContext ctx = new ApplicationContext context = new AnnotationConfigApplicationContext(Bean配置类); University ust = (University) ctx.getBean("university");
案列2:
指定bean的名称
@Component("university1") public class University { to do sthing... }
获取bean方式:
ApplicationContext ctx = new ApplicationContext context = new AnnotationConfigApplicationContext(Bean配置类); University ust = (University) ctx.getBean("university1");
在构造器上的注解
@Autowired :根据类型(ByType)来自动匹配(核心注解)
这个注解可以用于属性,setter方法,还有构造器上,这个注解用于注入依赖的对象。当再一个属性上加上@Autowired注解,有时可能要指定一些额外的值,Spring然后会自动的将值赋给这个属性。
案例1:作用在构造器上
public class MovieRecommender { private final CustomerPreferenceDao customerPreferenceDao; @Autowired public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { this.customerPreferenceDao = customerPreferenceDao; } // ... }
案列2:使用在setter方法上
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
案列3:使用在域属性上
public class MovieRecommender { private final CustomerPreferenceDao customerPreferenceDao; @Autowired private MovieCatalog movieCatalog; @Autowired public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { this.customerPreferenceDao = customerPreferenceDao; } // ... }
案列4:使用在任意方法名和产生的普通方法上
public class MovieRecommender { private MovieCatalog movieCatalog; private CustomerPreferenceDao customerPreferenceDao; @Autowired public void prepare(MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) { this.movieCatalog = movieCatalog; this.customerPreferenceDao = customerPreferenceDao; } // ... }
案列5:使用在域属性数组上
public class MovieRecommender { @Autowired private MovieCatalog[] movieCatalogs; // ... }
案列6:使用在集合类型上
public class MovieRecommender { private Set<MovieCatalog> movieCatalogs; @Autowired public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ... }
@Qualifier
这个注解和@Autowired一起使用,当想对注入的过程做更多的控制,@Qualifier可以帮助指定做更详细的配置。一般在两个或多个bean是相同的类型,spring在注入的时候会出现混乱
例如有个接口叫做Hellointerface,然后两个bean都实现了Hellointerface接口
@Component public class Bean1 implements HelloInterface { // } @Component public class Bean2 implements HelloInterface { // }
如果只使用@Autowired注解,Spring就不知道到底要注入哪一个bean。解决办法就是加上@Qualifier注解
@Component public class BeanA { @Autowired @Qualifier("bean2") private HelloInterface dependency; ...
@Resource:根据类型和名称(ByType & ByName)来自动匹配(核心注解)
@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。
@Resource有两个重要属性,分别是name和type
spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,这使用ByName的自动注入策略,如果使用Type类型则使用ByTyoe的自动注入策略。如果都没有指定,则听过反射机制使用ByName自动注入策略。
案列1:使用@Resource注解
@Resource(name="bucket") private String bucketName; @Resource(name="style") private String styleName;
翻译为xml模式来看
<bean name="bucket" class="java.lang.String"> <constructor-arg value="${oos.bucketName}"/> </bean> <bean name="style" class="java.lang.String"> <constructor-arg value="${oos.styleName}"/> </bean>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!