【Java笔记】Spring IoC & DI

06-01 1620阅读

目录

  • Spring IoC & DI
    • 1. IoC
      • 1.1 Bean的存储
        • 1.1.1 类注解
        • 1.1.2 方法注解 @Bean
        • 1.1.3 重命名
        • 1.1.4 Spring扫描路径
        • 2. DI

          Spring IoC & DI

          Spring两个核心思想:IoC & AOP

          Spring相当于一个容器,IoC就是把对象存放在Spring容器中,让Spring帮我们管理对象,DI就是从Ioc容器中取出对象并注入给另一个对象,简言之,IoC就是存对象,DI就是取对象

          1. IoC

          注解:@Component,表示BookService这个对象已经交给Spring管理了,Spring帮我们new了一个对象

          @Component
          public class BookService {
          	...
          }
          

          注解 :@Autowired表示从Spring容器中取出对象,赋值给bookService属性并且注入给BookController对象

          public class BookController {
              @Autowired
              private BookService bookService;
          	...
          }
          

          1.1 Bean的存储

          两类注解:

          1. 类注解 - 五大注解:@Controller @Service @Repository @Component @Configuration
          2. 方法注解:@Bean
          1.1.1 类注解
          @Controller
          public class UserController {
              ...
          }
          

          @SpringBootApplication在那个类上,哪个类就是启动类

          ApplicationContext可以理解为Spring容器,Spring管理的对象都在这个容器中,需要从这里边拿到对象

          通过 .getBean() 拿到对象,再执行对象中的方法,下代码示例是从ApplicationContext容器中获取对象的三种方法,三种方法获取到的是同一个对象:

          @SpringBootApplication
          public class SpringIocDemoApplication {
              public static void main(String[] args) {
                  // 1. 通过类名获取对象
                  ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);
                  UserController bean = context.getBean(UserController.class);
                  System.out.println(bean);
                  bean.sayHi();
                  // 2. 通过BeanName获得对象
                  UserController userController = (UserController)context.getBean("userController");
                  System.out.println(userController);
                  userController.sayHi();
                  // 3. 通过类名加类型获取对象
                  UserController userController1 = context.getBean("userController", UserController.class);
                  System.out.println(userController1);
                  userController1.sayHi();
              }
          }
          

          BeanName默认是类的小驼峰写法;当类名前两个字母都是大写时,BeanName就是类名

          五个注解都可以让Spring帮助管理对象

          @Controller @Service @Repository @Configuration 都是 @Component 的衍生注解

          不同的注解的功能相同,但是表示的含义不同,类似车牌号

          @Controller定位最清晰,表示接收请求的类通常使用@Controller或@RestController注解,不推荐使用其他注解(如@Service、@Repository等)

          1. @Controller :对应三层架构的表现层
          2. @Service:对应业务逻辑层
          3. @Repository:对应数据层
          4. @Configuration:表示配置层
          5. @Component:表示组件
          1.1.2 方法注解 @Bean

          @Bean必须搭配五大注解使用,因为如果类都没有交给Spring管理,那么方法是不会在Spring容器中找到的,一般搭配@Configuration @Component都可以

          将第三方的方法交给Spring管理使用@Bean

          【Java笔记】Spring IoC & DI
          (图片来源网络,侵删)

          @Bean注解定义的bean,beanName为方法名,不是类的小驼峰写法了

          同一个类型有多个bean只能通过以下的两种方式获取对象,需要加上beanName:

          【Java笔记】Spring IoC & DI
          (图片来源网络,侵删)
          UserInfo bean = context.getBean("user1",UserInfo.class);
          System.out.println(bean);
          UserInfo bean2 = context.getBean("user2",UserInfo.class);
          System.out.println(bean2);
          
          1.1.3 重命名

          五大注解的beanName重命名:

          @Repository("ur")
          public class UserRepository {
              public void doRepository() {
                  ...
              }
          }
          
          UserRepository bean = context.getBean("ur", UserRepository.class);
          bean.doRepository();
          

          @Bean的beanName重命名:

          【Java笔记】Spring IoC & DI
          (图片来源网络,侵删)
          @Bean(name = "zhangsan")
          public UserInfo user1() {
              UserInfo userInfo = new UserInfo(1, "zhangsan", 12);
              return userInfo;
          }
          
          UserInfo bean = context.getBean("zhangsan",UserInfo.class);
          

          也可以有多个重命名:

          @Bean(name = {"user1", "zhangsan"})
          
          1.1.4 Spring扫描路径

          启动类所在的路径就是默认的扫描路径,也可以通过在类上加注解@ComponentScan(basePackages = “路径”)指定扫描路径。

          2. DI

          DI就是依赖注入;

          Spring依赖注入的三种方式:

          1. 属性注入:使用注解@Autowired

            • 构造方法注入:如果只有一个构造方法,@Autowired可以省略(Spring 4.3+版本);

            • 如果存在多个构造方法,如果无参的构造方法和有参的构造方法同时存在,默认使用无参的构造方法;如果要使用有参的构造方法,需要在有参的构造方法加上@Autowired。优先使用加@Autowired注解的构造方法,因为@Autowired优先级最高,没有@Autowired Spring就会找无参的构造方法,如果没有无参的构造方法会报错

              	private UserService userService;	
                    
              	public UserController2() {
                  }
                    
                  // 构造方法注入
                  @Autowired
                  public UserController2(UserService userService) {
                      this.userService = userService;
                  }
              
              1. Setter注入

                setter方法也需要搭配@Autowired注解

              @Autowired
              public void setUserService(UserService userService) {
                  this.userService = userService;
              }
              

          程序员通常使用属性注入的方式

          当一个类中存在多个方法时,从这个类中取出方法需要使用:

          1. @Primary指定默认的bean

          2. @Qualifier(“beanName”)指定bean

          3. 当@Primary、@Qualifier(“beanName”)同时存在使用@Qualifier(“beanName”)

          4. 使用@Resource(name = “beanName”),作用等同于 @Qualifier(“beanName”) + @Autowired

          企业中更多使用的是@Resource(name = “beanName”) 和 @Autowired

          代码示例:

          //    @Autowired
          //    @Qualifier("user2")
              @Resource(name = "user2")
              private UserInfo userInfo;
          
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码