spring 详解五 IOC(注解开发)

这篇具有很好参考价值的文章主要介绍了spring 详解五 IOC(注解开发)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spring注解开发

注解开发已经成为开发的主流选择,例如springboot都是基于注解开发使用的spring,所以学习注解开发是很有必要的,基本Bean注解,主要是使用注解的方式替代原有xml的<bean> 标签及其标签属性的配置

<bean id="" name="" class="" scope="" lazy-init="" init-method="" destroy-method="" 
      
abstract="" autowire="" factory-bean="" factory-method=""></bean>

注解开发之Bean配置

XML 配置 注解 描述
<bean id=“” class=“”> @Component 被该注解标识的类,会在指定扫描范围内被Spring加载并实例化
<bean scope=“”> @Scope 在类上或使用了@Bean标注的方法上,标注Bean的作用范围,取值为singleton或prototype
<bean lazy-init=“”> @Lazy 在类上或使用了@Bean标注的方法上,标注Bean是否延迟加载,取值为true和false
<bean init-method=“”> @PostConstruct 在方法上使用,标注Bean的实例化后执行的方法
<bean destroy-method=“”> @PreDestroy 在方法上使用,标注Bean的销毁前执行方法
@Component("userDao")
@Scope("singleton")
@Lazy(true)
public class UserServiceImpl implements UserService{
   @PostConstruct
   public void init(){}
    
   @PreDestroy
   public void destroy(){}
}

配置spring扫描范围

<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
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 告知Spring框架去com.tech.test.service包及其子包下去扫描使用了注解的类 -->
    <context:component-scan base-package="com.tech.test.service"/>
</beans>    

@Component的衍生注解

注解 说明
@Controller 标注在控制器 
@Service 标注在业务类上 
@Repository 标注在数据访问类上

其效果与@Component一致,在其注解内部提供了别名@AliasFor别名注解,@Controller就和@Component的作用一致


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}

注解开发之依赖注入配置

之前的xml配置方式

<bean id="" class="">
   <property name="" value=""/>
   <property name="" ref=""/>
</bean>

注解配置 

注解 描述
@Value 使用在字段或方法上,用于注入普通数据
@Autowired   使用在字段或方法上,用于根据类型(byType)注入引用数据
@Qualifier 使用在字段或方法上,结合@Autowired,根据名称注入
@Resource 使用在字段或方法上,根据类型或名称进行注入

@Value

@Value("test")
private String username;

@Value("test")
public void setUsername(String username){
    System.out.println(username);
}

springBoot中读取配置文件

@Value("${jdbc.username: "test"}")
private String username;

@Value("${jdbc.username: "test"}")
public void setUsername(String username){
    System.out.println(username);
}

springBoot 读取配置文件时一定要注意,最好加上默认值,以免报错 

 @Autowired  

//使用在属性上直接注入
@Autowired
private UserDao userDao;

//使用在方法上直接注入
@Autowired
public void setUserDao(UserDao userDao){
      System.out.println(userDao);
}

@Resource 

@Resource
private UserDao userDao;

@Resource(name = "userDao2")
public void setUserDao(UserDao userDao){
    System.out.println(userDao);
}

@Autowire和@Resource的区别

来源不同:@Resource是Java EE规范定义的注解,而@Autowired是Spring框架定义的注解

注入方式不同@Resource默认按照Bean的名称进行注入,如果找不到与名称相匹配的Bean,则按照类型进行注入。而@Autowired默认按照类型进行注入,如果出现多个相同类型的Bean,则再按照名称进行匹配

属性名称不同:@Autowired没有name属性,而@Resource有name属性,可以指定要注入Bean的名称。

是否支持JSR-330:@Autowired支持JSR-330的@Inject注解,而@Resource不支持。

非自定义Bean注解开发

jar包中的类,并不是我们自己写的,需要使用@Bean注解将其注入容器,还有一点必须要注意,@Bean所在类必须被spring管理,也就是必须加入容器,用@Component也行,@Configuration也行,一般@Configuration

@Component
public class DataSourceTest {
    //将方法返回值Bean实例以@Bean注解指定的名称存储到Spring容器中
    @Bean("datasource")
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }
}

配置类注解开发

<import>、<context:componentScan> 等非<bean> 标签怎样去使用注解替代呢?

<!-- 加载properties文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- 组件扫描 -->
<context:component-scan base-package="com.itheima"/>

<!-- 引入其他xml文件 -->
<import resource="classpath:beans.xml"/>

 @Configuration注解

@Configuration注解标识的类为配置类,替代原有xml配置文件,该注解第一个作用是标识该类是一个配置类,第二个作用是具备@Component作用

//标注当前类是一个配置类(替代配置文件的)
//底层也封装了@Component注解
@Configuration
public class SpringConfig {
}

@ComponentScan 组件扫描配置 

@Configuration
@ComponentScan({"com.test.service","com.test.dao"})
public class SpringConfig {}

@PropertySource

注解用于加载外部properties资源配置,替代原有xml中的 <context:property placeholder location=“”/> 配置

@Configuration
@ComponentScan
@PropertySource({"classpath:jdbc.properties","classpath:xxx.properties"})
public class SpringConfig {}

  @Import注解

相当于<import resource=“”>配置

@Configuration
@ComponentScan("com.test.service")
@Import(DataSourceTest.class)
public class SpringConfig {
}

public class DataSourceTest {
    //将方法返回值Bean实例以@Bean注解指定的名称存储到Spring容器中
    @Bean("dataSource")
    public DataSource dataSource(@Value("${jdbc.driver}") String driverClassName, UserDaoImpl userDao){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }


    @Bean
    public DataSource beanTest01(@Qualifier("userDaoImpl") UserDao userDao, UserService userService){
        System.out.println(userDao);
        System.out.println(userService);
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }
}

Spring配置其他注解

 @Primary

@Primary注解用于标注相同类型的Bean优先被使用权,与@Component和@Bean一起使用,标注该Bean的优先级更高,则在通过类型获取Bean或通过@Autowired根据类型进行注入时,会选用优先级更高的

@Profile 

注解 @Profile 标注在类或方法上,标注当前产生的Bean从属于哪个环境,只有激活了当前环境,被标注的Bean才能被注册到Spring容器里

不指定环境的Bean,任何环境下都能注册到Spring容器里

使用方式 

命令行参数激活

 -Dspring.profiles.active=test

代码激活 

System.setProperty("spring.profiles.active","test");

Spring注解的解析原理

​@Component在类上标注完,Spring扫描到后,会被实例化成对象,再存储到Spring容器之中,现在研究一下为什么能创建对象

只要将Bean对应的BeanDefinition注册到BeanDefinition,就会经历Bean的生命周期,最终实例化一个Bean,其实就是BeanFactoryProcessor后处理器

不管是xml方式组件扫描还是注解方式组件扫描,最终的扫描方式是一样的,都是使用ClassPathBeanDefinitionScanner扫描器的doScan方法 ,感兴趣可以翻翻源码文章来源地址https://www.toymoban.com/news/detail-545567.html

到了这里,关于spring 详解五 IOC(注解开发)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring6】| Spring IoC注解式开发

    目录 一:Spring IoC注解式开发 1. 回顾注解 2. 声明Bean的四个注解 3. Spring注解的使用 4. 选择性实例化Bean 5. 负责注入的注解(重点) 5.1 @Value 5.2 @Autowired与@Qualifier 5.3 @Resource 6. 全注解式开发 注解的存在主要是为了简化XML的配置 ,Spring6倡导全注解开发。 我们来回顾一下:

    2023年04月12日
    浏览(49)
  • 【Spring篇】IOC/DI注解开发

    🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean  2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖注入 1.环境准备 2.注解实现按照类型注入

    2024年02月03日
    浏览(76)
  • Spring学习笔记之Spring IoC注解式开发

    注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发 注解怎么定义,注解中的属性怎么定义? 注解怎么使用 通过反射机制怎么读取注解 注解怎么定义,注解中的属性怎么定义? 以上是自定义了一个注解:Component 该注解上面修饰的注解包括:Target注解和Retention注解,

    2024年02月12日
    浏览(44)
  • 11Spring IoC注解式开发(上)(元注解/声明Bean的注解/注解的使用/负责实例化Bean的注解)

    注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点 :提高开发效率 注解开发的缺点 :在一定程度上违背了OCP原则,使用注解的开发的前提是需求比较固定,变动较小。 自定义一个注解: 该注解上面修饰的注解包括:Target注解和Retention注解,这两个注

    2024年01月21日
    浏览(44)
  • 使用 spring 的 IoC 的实现账户的CRUD(2)双层实现+注解开发

    在http://t.csdn.cn/yucl4的基础上进行注解开发 【分析】 xml文件其中spring容器中的bean, 因此通过注解把这些放到容器中即可 @component:相当xml中的bean的id: 如果不指定 value 属性,默认 bean 的 id 是当前类的类名, 首字母小写。 @Controller @Service @Repository是三个衍生 @Autowired 自动按照类型

    2024年02月03日
    浏览(43)
  • 129.【Spring 注解_IOC】

    (1).无注解注入方式 在pom文件中加入spring-context依赖: xml文件和注解的包 定义一个实体类 在resource目录下的beans.xml配置文件中通过 bean /bean标签注入类实例 获取容器中通过配置文件注入的实例对象 (2).注解注入方式 1.MyConfig.java 2.Main.java (1).无注解扫描方式 只要我们加上 @Config

    2024年02月12日
    浏览(34)
  • Spring IOC相关注解运用——上篇

    目录 前言 一、@Component 二、@Repository、@Service、@Controller 三、@Scope 四、@Autowired 五、@Qualifier 六、@Value 1. 直接设置固定的属性值 2. 获取配置文件中的属性值 3. 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列专栏文章 3. Spring系列专栏文章         注解配

    2024年02月02日
    浏览(42)
  • Spring IOC @Configuration注解分析

    在使用SpringBoot开发时,最常用的注解有@Component、@Service、@Controller、@Configuration等。当类使用这些注解标记时,类会被Spring IOC容器管理,包括创建,填充属性和实例化。 但是Spring容器如何发现并将这些类放到容器进行管理呢? 今天这篇博客主要分析Spring如何处理@Configuratio

    2024年02月08日
    浏览(35)
  • Spring IOC相关注解运用——下篇

    目录 一、@Configuration 二、@ComponentScan 1. 说明 2. 测试方法 3. 运行结果 三、@PropertySource 1. 说明 2. 测试方法 3. 测试结果 四、@Bean 1. 说明 2. 添加驱动依赖 3. 将Connection对象放入Spring容器 3. 测试 五、@Import 1. 说明 2. 测试方法 3. 运行结果 往期专栏文章相关导读  1. Maven系列专栏文

    2024年02月05日
    浏览(40)
  • javaee spring 用注解的方式实现ioc

    spring核心依赖 spring配置文件

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包