控制反转 Ioc
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计
思想。在 Java 开发中,Ioc 意味着将你设计好的对象交给容器控制,而不是传统
的在你的对象内部直接控制。创建对象。
就是把创建对象的过程交给外部(工厂,容器)创建,控制,实现解耦,一种设计思想
使用spring 创建对象
- 自定义User 对象
- 导入Spring
- 在resource中创建spring 配置文件
- 在spring配置文件中,设置对象创建细节
- 在测试类中创建springgIoc容器 ApplicationContext,创建User对象
类路径
指我们jvm加载字节码所在的目录
就是编译后生成target目录下的classes目录,称为类路径,Java文件夹的代码,resources文件夹下的配置、资源文件,在编译后都会存放在target->classes目录下
spring Ioc容器(ApplicationContext)的继承结构图
光标放在要访问的类上 按ctrl+h
通过继承结构图发现:ApplicationContext 常用的创建方式有3种
- 加载类路径下的配置文件 ClassPathXmlApplicationContext
- 注解方式创建容器 AnnotationConfigApplicationContext
- 加载项目外部的配置文件创建容器 FileSystemXmlApplicationContext
ApplicationContext ac1 = new ClassPathXmlApplicationContext("bean.xml");
ApplicationContext ac2 = new AnnotationConfigApplicationContext("c://xx/bean.xml");
ApplicationContext ac3 = new FileSystemXmlApplicationContext(User.class);
spring 创建对象的3种方式
- 默认无参构造器,创建对象
User user = new User();
<bean id="user" class="com.lxjava.User"></bean>
- 工厂静态方法创建对象
User user = LXBeanFactory.staticCreateUser();
<bean id="user" class="com.lxjava.factory.LXBeanFactory" factory-method="staticCreateUser"></bean>
- 工厂实例方法创建对象
LXBeanFactory factory = new LXBeanFactory();
User user = factory.createUser();
<bean id="factory" class="com.lxjava.factory.LXBeanFactory"></bean>
<bean id="user" factory-bean="factory" factory-method="createUser"></bean>
依赖注入 DI
DI Dependency Injection
动态给对象属性赋值
Ioc 的一个重点是在系统运行中,动态
的向某个对象提供它所需要的其他对象。这一点是通过 DI(Dependency Injection
依赖注入)来实现的。给对象属性赋值。
基于xml方式实现 依赖注入 DI
使用带参构造函数给对象属性赋值 construct-arg
使用set方法给属性赋值 property
通过P名称空间赋值 p:age=24
p名称空间是spring3.0后才有的,使用前需要先引入
给集合属性赋值
基于注解方式创建对象
@Controller
@Service
@Repository
@Component
- 在对应要创建的类上添加@Component注解
- 开启注解扫描
基于注解方式实现依赖注入
@Autowired
@Autowried修饰字段
@Autowried修饰方法
@Qualifier
指定注入哪个参数
与@AutoWired配合使用
@Resource
相当于@AutoWired与@Qualifier结合使用
jdk1.8 后不再支持。
@Value
1.往基本数据类型和 String 类型数据的属性赋值,不用再去xml中写值
2.配置文件取值
对象范围与生命周期相关的注解
@Scope
@Lazy
@PostConstruct
@PreDestroy
注解小结
创建对象相关的四个注解:
@Component 创建对象加入容器, 例如:工具类、其他组件
@Repository 创建对象加入容器, 例如:标识数据库访问层的组件
@Service 创建对象加入容器, 例如:标识乐屋逻辑层的组件
@Controller 创建对象加入容器 例如:标识控制层的组件
依赖注入的四个注解:
@Autowired 从容器中找对象,给属性赋值。根据类型、名称去容器中找。
@Qualifier 结合Autowired使用,可以指定按照名称去容器找对象注入。
@Value 给简单类型属性直接赋值/获取配置文件值@Value(“${key}”)
@Resource 从容器中找对象,给属性赋值。 根据名称、类型去容器中查找
生命周期相关的四个注解:
@Scope 单例/多例
@PostConstruct 初始化方法,创建对象后执行
@PreDestroy 销毁先执行
@Lazy 延迟初始化
重点:@Component 、@Autowired
原则:
- 无论使用XML还是注解实现IOC容器,底层实现都是一样的,做的事情都是一样的。
- 这两种都要掌握:XML、注解
- 哪种方便我们开发使用,就应用哪些方式(注解、xml)
项目应用:
- 自己写的类用注解
- jar包中的类用XML
spring 全注解开发
spring的xml 配置文件----》 spring 配置类 @Configuration
创建配置文件 @Configuration
使用xml创建的配置文件
新建一个类使用@Configuration标识
开启注解扫描 @ComponentScan(basePackages = “com.lxjava”)
xml中:
注解类使用@ComponentScan(basePackages = “com.lxjava”)