论坛项目学习记录【预备篇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+"战斗");
    }
	...//省略其它get\set

    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:视图解析器,根据给定的页面名称,生成页面内容
    在这里插入图片描述

SpringMvc实现显示视图

SpringMvc显示视图依赖Thymeleaf
项目结构

在这里插入图片描述
仓库地址当然需要安装Tomcat

6. 转发与重定向

6.1 转发

在这里插入图片描述
转发全程请求转发,是服务器内部对一个请求的偏转和发送,是一次请求,浏览器地址栏显示的是控制器的路径,显示的内容却是页面模板的内容。

6.2 重定向

重定向实际上是http协议提供的功能,客户端向服务器发送请求后,服务器向客户端响应302状态码,浏览器接收到302状态码后,立即向服务器指定的url发送新的请求

在这里插入图片描述
演示代码

/**
 * 演示重定向的控制器
 */
@RestController
@RequestMapping("/doc")
public class DocController {@GetMapping("/doc.do")
    public ModelAndView doc(){
        System.out.println("重定向到苍老师的网站");
        return new ModelAndView(
                "redirect:http://doc.canglaoshi.org");
    }
}

只要当前控制器的跳转目标不是我们的视图模板,就使用重定向
原因是SpringMvc中使用转发只能访问resources/templates/下的html文件

SpringMvc中使用session对象

我们编写的vrd项目登录后将用户信息保存在Session中 ->需要验证用户是否登录时直接检查session对象就可以了

SpringMvc中怎么控制管理Session呢? ->在登录成功时将用户对象保存在Session里

代码如下

//使用ModelMap传递信息的方法
    @PostMapping("/handle_login.do")
    public ModelAndView handleLogin(
            String username, String password, ModelMap map,
            HttpSession session){
        //方法的参数中声明session对象
        //DispatcherServlet就会自动将当前会话对象赋值到这个session中
        if("tom".equals(username)){
            if("123".equals(password)){
                map.put("message","登录成功");
                //登录成功,将用户保存在Session中
                session.setAttribute("user",username);
                return  new ModelAndView("message");
            }else{
                map.put("message","密码错误");
                return  new ModelAndView("message");
            }
        }else{
            map.put("message","用户名错误");
            return  new ModelAndView("message");
        }
    }

7. 拦截器

7.1 什么是拦截器

// TODO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boy快快长大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值