您现在的位置是:首页 >其他 >论坛项目学习记录【预备篇2】网站首页其他

论坛项目学习记录【预备篇2】

boy快快长大 2024-07-25 00:01:02
简介论坛项目学习记录【预备篇2】

在这里插入图片描述

1. 什么是依赖注入

就是在Spring容器内容将各个对象的依赖关系建立好的操作,最终的效果是从Spring容器中获得的对象是包含了被依赖对象的

2. 怎么使用依赖注入

如果不使用依赖注入,我们需要从Spring容器中获得相应对象,再通过编写代码建立依赖关系。
这样就会有代码的冗余,多个依赖关系的确定会造成代码臃肿。

@ComponentScan("cn.tedu.hero")
public class Config {

    @Bean
    public DragonBlade blade(){
        return new DragonBlade();
    }
    @Bean
    //方法的参数为DragonBlade类型
    //这个参数编写后,spring容器会自动从当前容器中所有内容中搜索
    //只要有DragonBlade类型的对象就会自动赋值到这个参数中
    public Hero guanYu(DragonBlade blade){
        Hero h=new Hero();
        h.setName("关羽");
        h.setAge(25);
        h.setDragonBlade(blade);
        return h;
    }
}

依赖注入注意事项

如果现在程序中有两把青龙偃月刀

 @Bean
    public DragonBlade blade1(){
        return new DragonBlade();
    }
    @Bean
    public DragonBlade blade2(){
        return new DragonBlade();
    }
    @Bean
    //方法的参数为DragonBlade类型
    //这个参数编写后,spring容器会自动从当前容器中所有内容中搜索
    //只要有DragonBlade类型的对象就会自动赋值到这个参数中
    public Hero guanYu(DragonBlade blade){
        Hero h=new Hero();
        h.setName("关羽");
        h.setAge(25);
        h.setDragonBlade(blade);
        return h;
    }

在运行之前的测试代码后发生异常:
expected single matching bean but found 2: blade1,blade2

原因是Spring容器中有2把青龙偃月刀,Spring并不能决定将哪一把赋给关羽的方法中所以发生了异常,解决方法时,注入关羽的方法的参数名,需要匹配其中一个青龙偃月刀的id。
代码如下:

@ComponentScan("cn.tedu.hero")
public class Config {

    //现在Spring容器中注入两把青龙偃月刀
    @Bean
    public DragonBlade blade1(){//id为blade1
        return new DragonBlade();
    }
    @Bean
    public DragonBlade blade2(){//id为blade2
        return new DragonBlade();
    }
    @Bean
    //方法的参数为DragonBlade类型
    //这个参数编写后,spring容器会自动从当前容器中所有内容中搜索
    //只要有DragonBlade类型的对象就会自动赋值到这个参数中
    //但是如果当前Spring容器中有两个或以上的DragonBlade对象
    //就需要按照DragonBlade对象的id来声明这个方法参数的属性名
    //如果方法参数的名称没有匹配任何Spring容器中的id,则会发生异常
    public Hero guanYu(DragonBlade blade2){
        Hero h=new Hero();
        h.setName("关羽");
        h.setAge(25);
        h.setDragonBlade(blade2);
        return h;
    }

}

3.组件扫描情况下依赖注入的实现

编写青龙偃月刀类

@Component
public class DragonBlade {

    private String name="青龙偃月刀";

    @Override
    public String toString() {
        return name;
    }
}

编写关羽类

注意使用@Autowired来自动装配需要的属性

@Component
public class GuanYu implements Serializable {

    private String name="关羽";
    //@Autowired英文翻译为自动装配
    //表示这个注解下面声明的属性Spring会自动将合适的类型的对象赋给它使用
    //当前Spring容器中包含唯一匹配DragonBlade类型的对象,那么它会自动赋值
    @Autowired
    private DragonBlade dragonBlade;

    public void fight(){
        System.out.println(name+"使用"+dragonBlade+"战斗");
    }
	// getset略    
}

使用Set方法注入

@Component
public class GuanYu implements Serializable {

    private String name="关羽";
    //@Autowired英文翻译为自动装配
    //表示这个注解下面声明的属性Spring会自动将合适的类型的对象赋给它使用
    //当前Spring容器中包含唯一匹配DragonBlade类型的对象,那么它会自动赋值
    private DragonBlade dragonBlade;

    public void fight(){
        System.out.println(name+"使用"+dragonBlade+"战斗");
    }
	...//省略其它getset

    public DragonBlade getDragonBlade() {
        return dragonBlade;
    }
	//Set方法上添加@Autowired注解也能实现依赖注入功能
    @Autowired
    public void setDragonBlade(DragonBlade dragonBlade) {
        this.dragonBlade = dragonBlade;
    }
}

4.@Resource注解的使用与@Autowired的区别

1.提供者不同:@Autowired是Spring提供的@Resource是java提供的

2.注入规则不同:

原则上

  • @Autowired注入规则为"byType"(通过类型)

  • @Resource注入规则为"byName"(通过名称)这里的名称就是对象的id

  • @Autowired是先检查类型,如果有类型匹配直接匹配,只通过类型不能匹配了,再通过id

  • @Resource是先匹配id,如果id匹配直接成功,如果没有id匹配再匹配类型

5.SpringMvc

M:model模型 V:View视图 C:Controller控制器
M:实体类 V:页面 C:Servlet

SpringMvc实际上主要针对的是视图(V)到控制器(C)的代码,控制器中要想获得视图的信息有很多冗余代码,(Servlet中需要很多request.getParameter()这样的方法获得表单中的信息)如果使用SpringMvc就能简便的获得他们而且现在我们是请求和Servlet1对1的关系,如果项目大,请求多nameServlet的数量也是不可控的这也是SpringMvc解决的问题

SpringMvc执行流程

  • DispatcherServlet:前端控制器,用于接收所有请求
  • HandlerMapping:用于配置请求与运行的方法的对应关系
  • Controller:控制器,这种对象时我们编写处理具体功能的
  • ModelAndView:控制器完成请求处理后,的处理结果一般是指定页面名称
  • ViewResolver:视图解析器,根据给定的页面名称,生成页面内容
    在这里插入图片描述

// TODO

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。