当前位置: 首页 > news >正文

Spring:IoC容器(基于注解管理bean)

1. HelloWorld 

  1. * 引入依赖
  2. * 开启组件扫描
  3. * 使用注解定义 Bean
  4. * 依赖注入

2.开启组件扫描 

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启组件扫描功能--><!--<context:component-scan base-package="com.itgyl.bean"></context:component-scan>--><context:component-scan base-package="com.itgyl.bean"></context:component-scan>
</beans>

 3.创建bean

@Component//该注解效果等同于<bean id="user" class="...">如果写value创建bean对象值默认使用开头字母为小写的类名
public class User {}

4.完成依赖注入

 @Testpublic void testUser() {ApplicationContext context =new ClassPathXmlApplicationContext("bean.xml");System.out.println(context);//获取bean时会自动完成依赖注入User user = context.getBean(User.class);System.out.println(user);}

 

 2. @Autowire注入

2.1 根据属性自动注入 

以MVC架构模式为栗 

@Controller
public class UserController {/**** 1.根据属性自动注入*/@Autowired //根据类型找到对应对象完成自动注入private UserService userService;public void show() {userService.show();System.out.println("controller...");}
}
@Service
public class UserServiceImp implements UserService{/**** 1.根据属性完成自动注入*/@Autowired //该注解会通过类型找到对应的对象完成注入private UserDao userDao;@Overridepublic void show() {userDao.show();System.out.println("userService...");}
}
@Repository
public class UserDaoImp implements UserDao{@Overridepublic void show() {System.out.println("userDao...");}
}

基于全注解配置IoC容器,把xml的配置文本用类来代替

@Configurable   //基于全注解创建IoC容器配置一个类,该类加上两个注解,注解@Configurable即该类为配置类
@ComponentScan("com.itgyl.autowired") //@ComponentScan注解里面的路径即从哪个包开始扫描自动注入bean
public class SpringConfig {
}
public class TestAutoWired {public static void main(String[] args) {ApplicationContext context =new AnnotationConfigApplicationContext(SpringConfig.class);UserController userController = context.getBean(UserController.class);userController.show();}
}

 

2.2 根据set方法自动注入

/**** 2.根据set方法自动注入*/@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
/**** 2.根据set方法完成自动注入*/@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}

2.3 根据构造器自动注入

/**** 3.根据构造器完成自动注入*/@Autowiredpublic UserController(UserService userService) {this.userService = userService;}
/**** 3.根据构造器完成自动注入*/@Autowiredpublic UserServiceImp(UserDao userDao) {this.userDao = userDao;}

2.4 通过形参自动注入

/**** 4.通过形参注入*/public UserController(@Autowired UserService userService) {this.userService = userService;}
/**** 4.通过形参注入*/@Autowiredpublic UserServiceImp(@Autowired UserDao userDao) {this.userDao = userDao;}

2.5 通过@AutoWire和@Qualifier注解完成注入

 @Autowired@Qualifier(value = "userServiceImp") //默认名字为开头首字母小写的类的名字private UserService userService;
@Autowired@Qualifier(value = "userDaoImp")private UserDao userDao;

总结

**总结**

* @Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
* 当带参数的构造方法只有一个,@Autowired注解可以省略。()
* @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

 

3. @Resource注入 

 3.1 根据name注入

@Controller
public class UserController {//@Resource注解即该实例化对象源于哪name的值要和传递的实例化对象保持一致//指定值接收就按照该值找相应的实例化bean@Resource(name = "myUserService")private UserService userService;public void show() {userService.show();System.out.println("controller...");}
}

3.2 无name值注入

//@Service中value的值即要传递的实例化对象,接收时的值要和该值保持一致
@Service(value = "myUserService")
public class UserServiceImp implements UserService {//@Resource此时不指定name的值则使用属性中的变量名和传递的bean实例化对象相匹配,要求该属性名和值保持一致//当@Resource注解使用时没有指定name的时候,还是根据name进行查找,这个name是属性名。@Resourceprivate UserDao myUserDaoImp;@Overridepublic void show() {myUserDaoImp.show();System.out.println("userService...");}
}
@Repository("myUserDaoImp")
public class UserDaoImp implements UserDao {@Overridepublic void show() {System.out.println("userDao...");}
}
@Configurable
@ComponentScan("com.itgyl.resource")
public class SpringConfig {
}
public class TestResource {public static void main(String[] args) {//通过全注解方式获取管理对象的IoC容器ApplicationContext context =new AnnotationConfigApplicationContext(SpringConfig.class);UserController u = context.getBean(UserController.class);u.show();}
}

总结

总结:**

@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个

 

http://www.lryc.cn/news/354534.html

相关文章:

  • 如何解决Redis缓存雪崩问题?
  • vue3的组件通信v-model使用
  • 从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】
  • 一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!
  • YoloV8实战:复现基于多任务的YoloV8方案
  • 专题汇编 | ChatGPT引领AIGC新浪潮(一)
  • Excel分类汇总,5个做法,提高数据处理效率!
  • 使用Nginx实现高可用HTTP和TCP代理:健康检查与最佳实践配置20240523
  • 代码随想录算法训练营Day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组 | Python | 个人记录向
  • Python编程的黑暗魔法:模块与包的神秘力量!
  • python编程不良习惯纠正: 慎用顶层代码
  • Simulate Ring Resonator in INTERCONNECT
  • Flutter 中的 DrawerController 小部件:全面指南
  • Flutter 中的 ImageFiltered 小部件:全面指南
  • C++第二十弹---深入理解STL中vector的使用
  • 【赠书第24期】Java项目开发实战(微视频版)
  • 多波段光源 通过8种波长实现的成像解决方案
  • 【Python】 如何从日期中减去一天?
  • 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化
  • SCT2360:4V-28v Vin,6A同步降压DCDC转换器与EMI减少
  • 企微运营SOP:构建高效、规范的运营流程
  • <商务世界>《76 微课堂<茶叶(2)-种类>》
  • 安卓Bug总结
  • 基于小波分析和机器学习(SVM,KNN,NB,MLP)的癫痫脑电图检测(MATLAB环境)
  • python数据分析:爬取某东商城商品评论数据并做词云展示(含完整源码及详细注解)
  • 当HR问你是否单身时,该怎么回答?
  • 大数据开发面试题【Spark篇】
  • 深入分析 Android Activity (六)
  • 火箭升空AR虚拟三维仿真演示满足客户的多样化场景需求
  • LeetCode 279 —— 完全平方数