Spring基础(八):注解方式创建对象IOC
2023-02-18 16:41:21 时间
注解方式创建对象IOC
一、注解方式创建对象IOC
导入依赖 aop
@Component 放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中
该注解有三个子注解
@Controller 用于实例化controller层bean
@Service 用于实例化service层bean
@Repository 用于实例化持久层bean
当不确定是哪一层,就用Component
这几个注解互相混用其实也可以,但是不推荐
1、在applicationContext.xml中配置开启注解扫描
<?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:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://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
">
<!--添加注解扫描,扫描指定的包,将包中的所有有注解的类实例化
base-package 后面放要扫描的包
如果有多个包需要扫描,可以使用逗号隔开 com.lanson.bean,com.lanson.service
或者可以写上一层包路径 com.lanson
可以通过注解指定bean的id@Component("user1")
如果不指定,则id默认是 类名首字母小写
-->
<context:component-scan base-package="com.lanson.bean"></context:component-scan>
</beans>
2、在类上添加注解,让spring容器给我们创建bean实例并存储于容器中
package com.lanson.bean;
import org.springframework.stereotype.Component;
/**
* @Author: Lansonli
* @Description: MircoMessage:Mark_7001
*/
@Component(value = "user1")
public class User {
}
3、测试代码
package com.lanson.test;
import com.lanson.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author: Lansonli
* @Description: MircoMessage:Mark_7001
*/
public class Test1 {
@Test
public void testGetBean(){
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
User user = context.getBean("user1", User.class);
System.out.println(user);
}
}
4、组件扫描配置注解识别
<!--
use-default-filters="false"
默认值为true 代表使用默认的扫描过滤器
默认的扫描过滤器会识别并包含 @Component @Controller @Service @Repository 四个注解
不使用默认的filter,使用我们自己的filter
-->
<!--控制只扫描Controller注解-->
<context:component-scan base-package="com.msb" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--控制不扫描Controller注解-->
<context:component-scan base-package="com.msb" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
二、注解方式依赖注入DI
@Autowired 根据属性数据类型自动装配
@Qualifier 根据属性名称注入依赖
@Resources 可以根据类型,也可以根据名称注入
@Value 注入普通数据类型(8+String)
项目结构如下
applicationContext.xml中配置包扫描和读取属性配置文件
Dao层接口
实现类
让容器扫描 Service层,实例化对象接口
实现类
package com.lanson.service.impl;
import com.lanson.dao.UserDao;
import com.lanson.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.Service;
import javax.annotation.Resource;
/**
* @Author: Lansonli
* @Description: MircoMessage:Mark_7001
*/
@Service
public class UserServiceImpl implements UserService {
/*
*@Autowired
* 根据类型到容器中去寻找对应的对象,找到后给当前属性赋值
* 不需要依赖 set方法
* 属性类型可以是接口,会自动匹配对应的实现类对象
* @Autowired配合 @Qualifier,可以通过名称指定注入的对象
*
* @Resource 如果不配置name 那么就是根据类型注入
* @Resource(name="userDaoImplB") 配置name,就是根据名称注入
*
*
* @Resource 是JDK中javax包的注解
* @Autowired 和 @Qualifier 是spring中的注解
*
* @Value 可以个普通属性赋值
* @Value 可以使用${}这种表达式获取系统的变量值
* 或者是.properties属性配置文件中的值
*
* */
//@Autowired
//@Qualifier("userDaoImplA")
//@Qualifier("userDaoImplB")
//private UserDao userDao ;
@Resource(name="userDaoImplB")
private UserDao userDao ;
@Value("${username}")
private String sname;
@Value("boy")
private String sgender;
@Value("${age}")
private Integer sage;
@Override
public void add() {
System.out.println("userServiceImpl add ... ... ");
System.out.println(sname);
System.out.println(sgender);
System.out.println(sage);
userDao.add();
}
}
测试代码
package com.lanson.test;
import com.lanson.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author: Lansonli
* @Description: MircoMessage:Mark_7001
*/
public class Test1 {
@Test
public void testGetBean(){
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userServiceImpl", UserService.class);
userService.add();
}
}
三、完全使用注解
创建配置类,替代XML配置文件
测试代码
@Test
public void testGetBean2(){
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
UserServiceImpl userService = context.getBean("userServiceImpl", UserServiceImpl.class);
userService.add();
}
相关文章
- 漫谈:四大运营商“两两合并”的可能与必然
- material Tree组件父节点联动改造
- 解放双手!根据代码自动生成时序图,这款IDEA插件真香!
- Centos 7 安装 OpenJDK 11 yum 方式
- 看了我常用的IDEA插件,同事也开始悄悄安装了...
- 保命小诀窍:IDEA远程Debug技巧,你了解吗?
- 我上线了一个炫酷的项目实战教程网站,可能有的小伙伴还不知道...
- 如何设计一个安全的对外接口,老司机总结了这几点
- 告别if else!试试这款轻量级流程引擎吧,自带IDEA插件真香!
- win10更新后低分辨率显卡驱动丢失,NVIDIA图形驱动程序安装失败终极解决方法
- 横空出世!MyBatis-Plus同款ES ORM框架,用起来够优雅!
- 别再用main方法测试了,太Low!这才是专业的SpringBoot项目测试方法!
- MyBatis这样用,同事直呼哇塞,堪称最佳实践!
- 几分钟上线一个项目文档网站,这款开源神器实在太香了!
- 牛逼!Markdown还能这么玩?这款开源神器绝了!
- 还在用HttpUtil?SpringBoot 3.0全新HTTP客户端工具来了,用起来够优雅!
- 船新 IDEA 2022.3 正式发布,新特性真香!
- 5分钟将ChatGPT搬进Lighthouse
- Chaos 测试下的若干 NebulaGraph Raft 问题分析
- 如何使用Arthas抓包确认RocketMQ发送消息耗时慢