网站商城支付宝开通怎么做,wordpress admin 403,为什么平面设计最后都转行了,外贸是什么依赖注入是⼀个过程#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源#xff0c;⽽资源指的就是对象. 在上⾯程序案例中#xff0c;我们使⽤了 Autowired 这个注解#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…依赖注入是⼀个过程是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源⽽资源指的就是对象. 在上⾯程序案例中我们使⽤了 Autowired 这个注解完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注⼊,Spring也给我们提供了三种⽅式:
1. 属性注入(FieldInjection)
2. 构造⽅法注入(ConstructorInjection)
3. Setter 注入(SetterInjection)
4.1 属性注入
属性注⼊是使⽤ Autowired 实现的将Service类注⼊到Controller类中.
Service 类的实现代码如下
Service
public class UserService {public void sayHi() {System.out.println(Hi,UserService);}
}
Controller 类的实现代码如下
Controller
public class UserController {Autowiredprivate UserService userService;public void sayHi(){System.out.println(hi,UserController...);userService.sayHi();}
}
获取Controller中的sayHi方法
public class DemoApplication {public static void main(String[] args) {//获取Spring上下文对象ApplicationContext context SpringApplication.run(DemoApplication.class, args);//从Spring上下文中获取对象UserController userController (UserController) context.getBean(userController);//使用对象userController.sayHi();}
}
运行结果 去掉Autowired,再运行⼀下程序看看结果 4.2 构造方法注入
构造方法注入是在类的构造方法中实现注入如下代码所示 Controller
public class UserController {private UserService userService;Autowiredpublic UserController(UserService userService) {this.userService userService;}public void sayHi() {System.out.println(hi,UserController...);userService.sayHi();}
}
注意事项如果类只有⼀个构造方法那么Autowired 注解可以省略如果类中有多个构造方法 那么需要添加上Autowired 来明确指定到底使用哪个构造方法。
4.3 Setter 注入
Setter 注入和属性的Setter方法实现类似只不过在设置set方法的时候需要加上Autowired 注 解如下代码所示例
Controller
public class UserController {private UserService userService;Autowiredpublic void setUserService(UserService service) {this.userService service;}public void sayHi() {System.out.println(hi,UserController...);userService.sayHi();}
}4.4 三种注入优缺点分析
优点缺点属性注入简洁使用方便 1、只能⽤于IoC容器如果是⾮IoC容器不可⽤并且只有在使⽤的时候才会出现NPE空指 针异常 2、不能注⼊⼀个Final修饰的属性 构造函数注入(Spring4.X推荐) 1、可以注⼊final修饰的属性 2、注⼊的对象不会被修改 3、 依赖对象在使⽤前⼀定会被完全初始化因为依赖是在类的构造⽅法中执⾏的⽽构造⽅法 是在类加载阶段就会执⾏的⽅法. 4、 通⽤性好,构造⽅法是JDK⽀持的,所以更换任何框架,他都是适⽤的 注⼊多个对象时,代码会⽐较繁琐Setter注入(Spring3.X推荐)方便在类实例之后,重新对该对象进⾏配置或者注⼊ 1、不能注⼊⼀个Final修饰的属性 2、注⼊对象可能会被改变,因为setter⽅法可能会被多次调⽤,就有被修改的⻛险 4.5 Autowired存在问题
当同⼀类型存在多个bean时,使⽤Autowired会存在问题
Component
public class BeanConfig {Bean(u1)public UserInfo user1() {UserInfo userInfo new UserInfo();userInfo.setName(张三);userInfo.setAge(18);return userInfo;}Beanpublic UserInfo user2() {UserInfo userInfo new UserInfo();userInfo.setName(李四);userInfo.setAge(20);return userInfo;}}
Controller
public class UserController {AutowiredUserService userService;AutowiredUserInfo userInfo;public void sayHi() {System.out.println(hi,UserController...);userService.sayHi();}
}
编译时出现报错 报错的原因是非唯一的Bean对象。
Spring提供了以下几种注解的解决方案
• Primary
• Qualifier
• Resource
使用Primary注解当存在多个相同类型的Bean注入时加上Primary注解来确定默认的实现.
Component
public class BeanConfig {Primary //指定该bean为默认的bean的实现Bean(u1)public UserInfo user1() {UserInfo userInfo new UserInfo();userInfo.setName(张三);userInfo.setAge(18);return userInfo;}Bean(u2)public UserInfo user2() {UserInfo userInfo new UserInfo();userInfo.setName(李四);userInfo.setAge(20);return userInfo;}}
使用Qualifier注解指定当前要注⼊的bean对象。在Qualifier的value属性中指定注入的bean 的名称。
Qualifier注解不能单独使用必须配合Autowired使用
Controller
public class UserController {Qualifier(u2)Autowiredprivate UserInfo userInfo;public void sayHi() {System.out.println(hi,UserController...);System.out.println(userInfo);}
}运行结果 使用Resource注解是按照bean的名称进行注入。通过name属性指定要注⼊的bean的名称。
Controller
public class UserController {Resource(nameu2)private UserInfo userInfo;public void sayHi() {System.out.println(hi,UserController...);System.out.println(userInfo);}
}运行结果 Autowird与Resource的区别 1、Autowired是spring框架提供的注解而Resource是JDK提供的注解 2、Autowired默认是按照类型注入而Resource是按照名称注入.相比于Autowired来说 Resource支持更多的参数设置例如name设置根据名称获取Bean.
Autowired装配顺序