javaEE学习——SpringIocDI

Spring 是一个包含众多工具的IOC容器

Spring包含两大核心思想

IOC和AOP

IOC:控制反转,容器:可以装东西

(Spring是装对象的容器)

例如加一个注解,就是让Spring帮你去管理代码。

ioc是一种思想,DI是一种实现方式,

DI是一种依赖注入

@Autowired 告诉Spring ,从容器中取出这个对象,赋值给当前对象属性

    @Autowired
    private Framework framework;
-----------------------------------------------

    private Framework framework;
    public Car(){
        framework = new Framework();
    }

上面的代码就等价于下面的代码

@SpringBootApplication
public class IocStudyApplication {

    public static void main(String[] args) {

       ApplicationContext context= SpringApplication.run(IocStudyApplication.class, args);
    }

}

启动代码会返回一个容器,使用ApplicationContext 去接收这个Sping 的运行环境翻译为上下文

可以使用getBean来获取里面的内容,主要有三种,第一种为根据名称来取,第二章为根据类型来取,第三种为根据名称和类型来取

根据名称获取时,要使用小驼峰来获取,如果前两个字母都是大写的,那么前两个字母都要小写

获取Bean的两种方式

ApplicationContext 和BeanFactory

继承关系和功能来说ApplicationContext是BeanFactory的子类,不但有BF的所有功能,还有独特的特性,比如对国际化支持,资源访问支持,以及事件传播,等等。

性能来所,ApplicationContext一次性加载并初始化了所有的Bean对象,而BF是需要才会加载,更加轻量。但如今以及不缺空间了,所以不如直接用AP

5大注解@Controller @Service @Respitory @Configuration @Componet

作用类型都是类,都是为了将类加入到容器里面,表示让Spring帮忙管理这个对象

只能加在类上,并且只能加在自己的代码上面

如果我引入了一个第三jar包,也希望交给Spring管理,是没有办法加五大注解的

@ComponentScan可以指定扫描路径

方法注解@Bean

Bean必须搭配五大注解来使用

用@Bea数参数,根据名称来获取

如果需要Bean的类型,对应的对象只有一个时,就直接赋值,如果有多个时,根据名称进行匹配

SpringBoot的一个特点,约定大于配置

DI依赖注入的方式

1.属性注入

2.构造方法注入

3.Set方法注入

1.使用@Autowired注入

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    public void doController(){
        System.out.println("do Controller");
    }
}

优点:简洁方便

缺点,只能用于IOC容器,不能注入一个final修饰的对象

2.构造方法:注意添加了有参的构造函数后,也应该把无参的构造函数加上

@Controller
public class UserController {
//    @Autowired
//    private UserService userService;
    private  UserService userService;
    public UserController(UserService userService){
        this.userService=userService;
    }
    public void doController(){
        userService.doS();
        System.out.println("do Controller");
    }
}

优点:可以注入final对象,它注入的对象不会被修改。通用性好。

缺点,注入多个时,比较繁琐。

如果存在多个构造函数需要加上@Autowired,注明使用那个构造函数,如果只有一个构造函数,则可以省略。

3.set注入

@Controller
public class UserController {
//    @Autowired
//    private UserService userService;
    private  UserService userService;
    @Autowired
    public void setUserService(UserService userService){
        this.userService=userService;
    }
    public void doController(){
        userService.doS();
        System.out.println("do Controller");
    }
}

优点:注入完后,可以通过set去修改属性。也同样是缺点。

注意Autowried会存在一些问题,如果一个类型存在多个对象时,有限进行名称匹配,如果名称匹配不上,就报错。

解决办法
1.属性名和需要使用的对象名保持一致
2.适用@primary注解标识默认的对象
 @Primary
    @Bean
    public UserInfo userInfo2(){
        UserInfo userInfo =new UserInfo();
        userInfo.setAge(232);
        userInfo.setId(2);
        userInfo.setName("lisi");
        return  userInfo;
    }
3.使用Qualifier来标注默认的对象 
 @Qualifier("u1")
@Autowried
    private  UserService userService;
4.使用Resource注解

Autowried是按类型来注入的,Resource是按名称来注入的

Autowried默认是按类型来注入的,但同一个类型如果有多个对象,就会按照名称匹配 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值