11.使用注解实现springIoC容器
三类注解
组件类型注解-声明当前类的功能与职责
自动装配注解-根据属性特征自动注入对象
元数据注解-更细化地辅助IoC容器管理对象的注解
四种组件类型注解
@Component 组件注解,通用注解被该注解描述的类将被IoC容器管理并实例化
@Controller 语义注解,说明当前类是MVC应用中的控制器类
@Service 语义注解说明当前类是Service业务服务类
@Repository 语义注解,说明当前类用于业务持久层,通常描述对应Dao类
package com.spring.ioc.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
}
----------------------------------------------
package com.spring.ioc.dao;
import org.springframework.stereotype.Repository;
//组件类型注解默认beanId为类名首字母小写
@Repository
public class UserDao {
}
----------------------------------------------
package com.spring.ioc.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
}
----------------------------------------------
package com.spring.ioc.utils;
import org.springframework.stereotype.Component;
@Component
public class StringUtils {
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--在IoC容器初始化时自动扫描四种组件类型注解并完成实例化
@Repository
@Service
@Controller
@Component
-->
<context:component-scan base-package="com.spring"/>
</beans>
package com.spring.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringApplication {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
String[] ids = context.getBeanDefinitionNames();
for(String id : ids){
System.out.println(id + ":" + context.getBean(id));
}
}
}
两类自动装配注解
按类型装配
@Autowired 按容器内对象类型动态注入属性由Spring机构提供
@inject 基于JSR-330(Dependency Injection for Java)标准,其他同@ Autowired,但不支持required属性
按名称装配
@Named 与@Inject配合使用,JSR-330规范,按属性名自动装配属性
@Resource 基于JSR-250规范,优先按名称、再按类型智能匹配
在属性名和set方法上增加装配注解都可以完成对象的注入,如果装配注解放在set方法上,则自动按类型/名称对set方法参数进行注入,如果装配注解放在属性名上,Spring IoC容器会自动通过反射技术将属性private修饰符自动改成public,直接进行赋值,不再执行set方法,基于注解完成对象依赖注入,通常不会生成set方法,直接在属性上增加装配注解。

package com.spring.ioc.service;
import com.spring.ioc.dao.IUserDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class DepartmentService {
/**
* 1.@Resource设置name属性,则按name在IoC容器中将bean注入
* 2.@Resource未设置name属性
* 以属性名作为bean name在IoC容器中匹配 bean,如有匹配则注入
* 按属性名未匹配,则按类型进行匹配,同 @Autowired,需加入@Primary解决类型冲突
* 在使用@Resource对象时推荐设置name或保证属性名与bean名称一致
*/
// @Resource(name = "userOracleDao")
// private IUserDao userDao;
@Resource
private IUserDao userOracleDao;
public void joinDepartment(){
System.out.println(userOracleDao);
}
}

package com.spring.ioc.dao;
import org.springframework.stereotype.Repository;
//组件类型注解默认beanId为类名首字母小写
@Repository
public class UserDao implements IUserDao{
public UserDao(){
System.out.println("正在创建UserDao对象:"+this);
}
}

package com.spring.ioc.dao;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
@Repository
@Primary
public class UserOracleDao implements IUserDao{
public UserOracleDao(){
System.out.println("正在创建UserOracleDao对象"+this);
}
}

package com.spring.ioc;
import com.spring.ioc.service.DepartmentService;
import com.spring.ioc.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringApplication {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// String[] ids = context.getBeanDefinitionNames();
// for(String id : ids){
// System.out.println(id + ":" + context.getBean(id));
// }
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService.getUserDao());
DepartmentService departmentService = context.getBean("departmentService", DepartmentService.class);
departmentService.joinDepartment();
}
}
元数据注解
@Primary 按类型装配时出现多个相同类型对象拥有此注解对象优先被注入
@PostConstruct 描述方法,相当于XML中init-method配置的注解版本
@PreDestroy 描述方法,,相当于XML中destroy-method配置的注解版本
@Scope 设置对象的scope属性
@Value 为属性注入静态数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!