Spring的注解

Spring的注解

一、用法

使用注解的方式来开发定义bean

原本的bean开发书写如下所示:

<bean id="bookDao" class="com.liu.dao20250410.BookDao"/>

使用注解的方式代替bean,如下所示:context开辟空间,scan扫描bean的类,在该类的上方添加注解" @componet("bookDao") ",括号里面的表示bean的id,可以不写,前提是使用类型

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       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">
      
<context:component-scan base-package="com.liu.dao20250410"/>

</bean>
-----------注解的类----------------
@Component("bookDao")
public class BookDao {

     public void save() {
        System.out.println("注解开发");
    }
}

二、纯注解开发

​ 使用了注解开发bean,可以写一个配置的注解类来代表之前的配置信息,相当于bean的哪些配置信息,下面是一个注解类的配置样例

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration	//设置当前类为注解类
@ComponentScan("com.liu.dao20250410")	//相当于扫描匹配bean的配置类,扫描路径
public class SpringConfig {
}

------------原本xml的注解配置----------
<context:component-scan base-package="com.liu.dao20250410"/>
  • ​ 纯注解开发:其实就是加个注解,想要什么就加什么注解,例如想要生成的类是单例,想要控制bean的生命周期、自动装配等就在其需要的类或方法等之前加个注解就可以实现之前bean的一个意思。

    @Component("bookDao")
    @Scope("prototype")
    public class BookDao {
    
        @PostConstruct
         public void save() {
            System.out.println("生命周期");
        }
    }
    
  • 刚才测试的时候需要注意的小事项,其实就是自己还不是很理解如何使用注解开发,先看成功的小测试

    ---------dao层----------
    @Component("bookDao")
    @Scope("prototype")
    public class BookDao {
    
        @PostConstruct
         public void save() {
            System.out.println("生命周期");
        }
    }
    
    --------service层----------
    @Component("bookService")
    public class BookService01 {
    
        @Autowired	//自动装配,可以不写setter方法
        private BookDao bookDao;
    
        public void save(){
            System.out.println("service do save......注解开发");
        }
    }
    
    --------注解类层------
    @Configuration
    @ComponentScan("com.liu.service20250410")
    @ComponentScan("com.liu.dao20250410")
    public class SpringConfig {
    }
    
    ----------测试类-------
    @Test
        public void Test(){
            ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
            BookService01 bookService01=(BookService01) ctx.getBean("bookService");
            bookService01.save(); 
        }
    }
    

上面这个例子其实是按类型装配,有两个bean吧,在bookservice里面定义了bookdao类为属性,然后在测试类里面获取了bookService的bean。刚开始我是在注解类里面只设置了一个bookService的bean路径,然后出现报错,大概意思就是找不到bookDao的bean吧,刚开始我以为的是我在测试类里面只拿到了一个bean,那么我在配置类里面就不需要这样的@ComponentScan("com.liu.service20250410")路径扫描,然后没有写bookDao类的,结果证明我还不太理解纯注解的开发。其实怎么能不写呢?@ComponentScan("xxx.xxx")就相当于一个bean啊,bean都没有还哪里拿到这个bean。

  • 还有一个注意点,就是自动装配是基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此不用提供setter方法。

  • 使用@Value实现简单类型注入,只需要将注解写到属性名上,然后传值

@Value("lilili")
private String name;

 public void save() {
    System.out.println("bookDao......"+name);
}

纯注解开发流程:设置配置注解类,在该类的上面添加bean的扫描路径,也是就该bean代表的是哪一个类 ----------> 然后在类bean的上方设置属于该类的bean的id --------> 然后可以向该bean添加注入的属性值,或者外部数据等bean的一些操作 ---------> 最后在测试类里面创建容器,拿到bean

  • ​ 加载外部配置文件,读取propertySource文件,使用@proper

三、注解开发管理第三方bean

使用bean管理第三方资源

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

public class JdbcConfig {
       //1.定义一个方法获得要管理的对象
    @Bean
    public DataSource dataSources(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("root");
        return ds;  //将方法的返回值定义为一个bean
    }

}

-----------------------导入第三发方数据--------------
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration		//作为配置类
//@ComponentScan("com.liu.config20250414")
@Import({JdbcConfig.class})	//定义这个外部资源的来源
public class SpringConfig {

}

------------------测试类--------------------------
public class Test {

    @org.junit.Test
    public void Test01() {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        //2.获取SpringConfig的bean
        DataSource dataSource = ctx.getBean(DataSource.class);
        System.out.println(dataSource);
    }


}

bean管理第三方资源的基本流程:其实就是定义一个类来作为配置类(也就是上面的SpringConfig类所起到的作用),使用注解来引入第三方资源的配置信息(也就是写下第三方数据的所在的一个路径);定义一个bean来管理第三方数据(在另一个类里面书写,该类就是作为bean,这个bean代表的就是第三方数据信息,上面的JdbcConfig类就是这个作用)

四、第三方bean依赖注入

  • ​ 简单类型依赖注入,配置类:传入形参时,要在配置类里面加入要扫描的形参类路径,否则会找不到传入的形参类,出现报错。
public class JdbcConfig {
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/spring_db")
    private String url;
    @Value("root")
    private String username;
    @Value("root")
    private String password;
       //1.定义一个方法获得要管理的对象
    @Bean
    public DataSource dataSources(Dao20250414 dao20250414){	//传入形参
        Dao20250414 dao202504141=new Dao20250414();
        System.out.println(dao202504141);
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;  //将方法的返回值定义为一个bean
    }

}
---------------配置类:传入形参时,要在配置类里面加入要扫描的形参类路径-------
@Configuration
@ComponentScan("com.liu.dao20250414")
@Import({JdbcConfig.class})
public class SpringConfig {

}

五、注解开发总结

xml配置对比注解配置

xml配置:定义bean(id属性、class属性) 注解:@xxxx

​ 设置依赖注入 @Autowired、 @Value

​ 配置第三方bean(bean标签、工厂) @Bean

​ 作用范围(scope属性) @Scope

​ 生命周期(标准接口:init-method、destroy-method) @PostConstructor、@PreDestroy

  • 注解开发使得开发更加整洁
posted @ 2025-04-19 00:29  里莉  阅读(9)  评论(0)    收藏  举报