就是在Spring容器内容将各个对象的依赖关系建立好的操作,最终的效果是从Spring容器中获得的对象是包含了被依赖对象的
如果不使用依赖注入,我们需要从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;
}
}
编写青龙偃月刀类
@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;
}
}
1.提供者不同:@Autowired
是Spring提供的@Resource
是java提供的
2.注入规则不同:
原则上
@Autowired注入规则为"byType"(通过类型)
@Resource注入规则为"byName"(通过名称)这里的名称就是对象的id
@Autowired是先检查类型,如果有类型匹配直接匹配,只通过类型不能匹配了,再通过id
@Resource是先匹配id,如果id匹配直接成功,如果没有id匹配再匹配类型
M:model模型 V:View视图 C:Controller控制器
M:实体类 V:页面 C:Servlet
SpringMvc实际上主要针对的是视图(V)
到控制器(C)
的代码,控制器中要想获得视图的信息有很多冗余代码,(Servlet中需要很多request.getParameter()这样的方法获得表单中的信息)如果使用SpringMvc就能简便的获得他们而且现在我们是请求和Servlet1对1的关系,如果项目大,请求多nameServlet的数量也是不可控的这也是SpringMvc解决的问题
SpringMvc显示视图依赖Thymeleaf
项目结构