配置方式2:基于注解配置
1、xml+注解配置 (第1步:在xml中开启注解配置)
注意:这里需要额外导入spring-aop的jar包
@Component |
被标示类会被纳入spring ioc容器进行管理,相当于<bean> |
@Value |
为spring中所有管理的该类对象注入基本类型和String属性值 |
@Autowired |
为spring中所有管理的该类对象注入引用类型属性值;默认按类型注入,可以通过@Qualifier("dog2")指定注入哪个bean,同时也可以通过bean加入 primary="true" 优先被Autowired注入 |
@Resource |
默认按类型注入,如果指定了name属性,则按bean名称注入 |
2、java配置+注解配置 (第1步:在配置类中开启注解扫描)
@ComponentScan("com.cc.config") |
会去com.cc.config扫描@Component @Value @Autowired进行创建bean或注入属性值 |
配置方式3:基于java的配置(主流)
注意:需要再多导入一个包spring-aop-5.0.14.RELEASE.jar
1)AnnotationConfigApplicationContext
@Configuration |
指定该类为spring ioc容器配置类,相当于beans.xml文件 |
@Bean(name="user") |
将方法返回值纳入到spring ioc容器进行管理,相当于 <bean> |
【注意】spring bean的底层就是用的反射技术来实例化bean
总结:IOC是一种思想,为了减轻程序员自己new对象工作同时更好的管理bean的依赖,实现IOC方式,第1是自己工厂类(使用工厂模式) 第2是自己使用spring 的bean工厂。
1.1. 单例模式
单例模式:一个类永远只会实力化一个对象!!
任何对象都有一个 hashcode()方法 ,这个方法用来返回对象的hashcode码?
hashcode码就是对象在内存中地址的整数形式!!
单例模式实现方式:设计模式
1、懒汉式
2、饿汉式
3、多线程下的单例模式
double check 保证单例模式在多线程下线程安全,同时解决每个线程都要获取一遍锁的开销
4、问题:Student student = new Student();
1.在内存中开辟空间
2.初始化对象
3.将对象地址赋值Student引用 student
原子操作:要么同时成功 要么同时失败!!
多线程下任然会有线程不安全问题,解决方案
5、解决double check下的线程不安全问题
double check + volatile关键字
6、优雅:用静态内部类的方式实现单例模式 Doug Lea
1.2. DI 依赖注入
DI:dependency Injection 依赖注入 (给类的属性注入值)
1、set方法注入
2、构造方法注入
3、接口注入(不常用)
① 根据参数名进行注入 与参数顺序无关,与构造方法定义的顺序有关
② 根据参数下标进行注入
1.3. Bean属性
① id/name : bean的唯一标示
id是bean的唯一标示
id和name可以同时写; id是唯一标示 name别名
name也是bean唯一标示
建议:一般建议使用id指定bean的唯一标示
② class 类的全限定名
③ scope bean的作用域
(Default) Scopes a single bean definition to a single object instance for each Spring IoC container. (默认)将单个 bean 定义范围到每个 Spring IoC 容器的单个对象实例。 |
|
Scopes a single bean definition to any number of object instances. 将单个 bean 定义范围到任何数量的对象实例。 |
|
Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext. 将单个 bean 定义范围到单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义背面创建的。仅在 Web 感知 Spring 应用程序上下文的上下文中有效。 |
|
Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext. 将单个 bean 定义范围到 HTTP 会话的生命周期。仅在 Web 感知 Spring 应用程序上下文的上下文中有效。 |
|
Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext. 将单个 bean 定义范围到 ServletContext 的生命周期。仅在 Web 感知 Spring 应用程序上下文的上下文中有效。 |
|
Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext. 将单个 bean 定义范围到 WebSocket 的生命周期。仅在 Web 感知 Spring 应用程序上下文的上下文中有效。 |