学习Springday01 IOC
1. Spring概念
1 .1spring是开源的轻量级框架
1.2 spring核心主要两部分:
(1)aop面向切面编程:
扩展功能不是修改源代码实现
(2)ioc控制反转:
把对象的创建不是通过new方式实现,而是交给spring配置创建类对象将我们控制对象的使用权,反转给了Spring容器
1.3 spring是一站式框架
(1)spring在javaee三层结构中,每一层都提供不同的解决技术
- web层:springMVC
- service层:spring的ioc
- dao层:spring的jdbcTemplate
方便解耦:高类聚低耦合
2.入门案例IoC
2.1 导入架包
四个核心Jar版本5.10
beans:bean管理
Context:上下文(体现在xml配置)
Expression Language:spring EL表达式
Core:spring框架基石核心支持
一个依赖
logging:日志依赖
beans、context 、core、expression均是spring官网下载的spring包中的,而logging是Oracle官网,commons组件中的一个。
依赖下载地址:
http://commons.apache.org/proper/commons-logging/download_logging.cgi
点download‘
2.2 测试
提供UserService接口和实现类
获取UserService 实现类的实例
传统开发 用new一个对象
Spring实列创建对象:Ioc控制反转
实例对象:从Spring容器中获取,需要配置实现类的全限定路径到xml
//目标类
public interface UserService {
public void addUser();
}
public class USerServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("实现方法");
//bean配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 配置Service
id:用于获得实例
class:实力全限定类名 -->
<bean id="userServiceId" class="com.java.a_ioc.USerServiceImpl"></bean>
</beans>
//测试类
public void demo2(){
//从类路径ClassPath中寻找指定的XML配置文件,找到并装载
//完成ApplicationContext的实例化工作。
String xmlPath="com/java/a_ioc/beans.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
//获得内容 不需要自己new,都是冲spring容器中获得
UserService userService=(UserService) applicationContext.getBean("userServiceId");
userService.addUser();
}
3.入门案例DI依赖注入
3.1 测试
测试类:写一个Dao和Service
配置bean如下:
<!-- 模拟Spring执行过程
创建service实例
将dao设值给service
-->
<!-- property 用于属性的注入
name bean的属性名,通过set方法获得
setBookDap##》BookDao##》bookDao
ref:另一个bean的id值引用
-->
<bean id="bookService" class="com.java.b_DI.BookServiceImpl">
<property name="bookDao" ref="bookDaoId"></property>
</bean>
<bean id="bookDaoId" class="com.java.b_DI.BookDaoImpl"></bean>
4核心API
BeanFactory,用于生产任何bean的工厂
特点(第一次采用延迟加载)getBean时才会初始化Bean
ApolicationContext: BeanFactory的子接口
配置文件加载就进行实例化
ClassPathXmlApplicationContext: 加载classpayh(类路径src)下的xml
加载xml运行位置: /WEB-INF/classes/…xml
**FileSystem XmlApplicationContext:**加载指定盘符下的xml
加载xml运行位置: /WEB-INF/…xml
通过java web ServletContext.getRealPath()获取盘符
5装配Bean基于XML
** 5.1实例化方式:工厂模式**
3种实例化方式:默认构造,静态工厂,实例工厂
静态工厂,用于生成实例化对象,所有的方法必须是static
实例工厂:必须先有工厂实例对象,通过实例对象创建对象,提供所有方法必须是 “非静态”的
5.2Bean的种类
普通bean: Spring直接创建就实现A实列,并返回
**FactoryBean:**特殊的bean,具有工厂生成对象的能力,只能生产特定的对象。
Bean必须使用FactoryBean接口,此接口提供个体Object()用于获得特定bean(对象)
<bean id=””class=”FB”>先创建FB的实例,使用getObject()方法,并返回方法中的值。--------FB fb=new FB(); return fb.getObject();
BeanFactory和FactoryBean却别:
**BeanFactory:**工厂,用来生成任意bean。
**FactoryBean:**特殊Bean,用于生成另一个特定的bean。
例如:ProxyFactoryBean:用于生成代理的。<bean id=””class=”。。。。ProxyFactoryBean”>获取的是代理对象的实例
5.3作用域
常用取值
Singleton 单例,默认值
Prototype 多例 每执行一次getBean将获得一个实列。
Scope=“”;
5.4生命周期
5.4.1.初始化和销毁
目标方法执行前后,执行初始化和销毁方法
Bean配置
<!-- init-method:配置初始方法,准备数据 destroy-method:配置销毁方法,清理资源等-->
<bean id="userServiceId"class=“com.java.d_Life.init_destory.USerServiceImpl”
init-method=“initUser” destroy-method=“destoryUser” >
//要求:
1容器必须closs,销毁执行;
2作用域必须是单例模式
5.4.2. BeanPostProcessor后处理Bean
参照学习:https://blog.csdn.net/sinat_27548257/article/details/86607405
5.5属性的依赖注入
5.5.1构造方法注入
<!-- constructor-arg:用于配置构造方法的一个参数
index:参数索引,从零开始。匹配构造方法参数
type:确定参数类型
-->
<bean id="userId" class="com.java.f_xml.a_constructor.User" >
<constructor-arg index="0" type="java.lang.Integer" value="011"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="10"></constructor-arg>
</bean>
5.5.2Set方法注入
<bean name="helloSpring" class="com.dx.spring.beans.HelloSpring">
<property name="name" value="Spring"></property>
</bean>
5.5.3使用p命名空间
为了简化xml文件的配置,原来越多的xml文件采用属性而非子元素配置信息。
5.5.4 SpEL(了解)
5.5.5集合注入【重要较简单】
集合的 注入都是给<propert>添加子标签
<!-- 集合方法注入
集合的 注入都是给<propert>添加子标签
Array:
List:
Set:
Map: 存放kv键值对 用<entry>描述
Properties: <props> <pro key=""></prop> </props>
普通数据:<value>
引用数据 : <ref>
-->
<bean id="collDateId" class="com.java.f_xml.c_collDate.CollDate">
<property name="arrayDate">
<array>
<value>校长</value>
<value>教育处主任</value>
<value>教育处副主任</value>
</array>
</property>
<property name="listDate">
<list>
<value>58</value>
<value>50</value>
<value>40</value>
</list>
</property>
<property name="setDate">
<set>
<value>可靠</value>
<value>上级</value>
<value> 下属</value>
</set>
</property>
<property name="mapDate">
<map>
<entry key="jony" value="20"></entry>
<entry key="jony2" value="22"></entry>
<entry key="jony3" value="24"></entry>
</map>
</property>
<property name="propsDate">
<props>
<prop key="高富帅">ss</prop>
<prop key="白富美">ss</prop>
<prop key="屌丝">ss</prop>
</props>
</property>
</bean>
6.装备Bean基于注解
注解:就是一个类,使用@注解名称
开发中,使用注解,取代xml配置文件。
1.@Component 取代
@Component(“id”)取代
注解使用前提,添加命名空间,让Spring去扫描含有注解类
Spring常用注解,自动扫描装配Bean
bean的装配,需要导入AOP包
ersion=“1.0” encoding=“UTF-8”?>
Spring_注解装配bean&AOP编程
学习参照:https://www.jianshu.com/p/a89a9563c305
spring中使用@Resource进行注入为什么可以不用set方法
@Autowired
private UserDao userDao; 不用写set get就能注入,当然,前提是你已经开启了注解功能。
不仅是@Resource,使用@Autoware注解也是不需要set和get方法的。因为spring在实例化对象时,是通过java的反射机制注入实例。
spring反射实例化对象,在实例化对象时也需要实例类中的非静态field,如果有set方法,可以通过方法名找到Method.invoke()来初始化field,但是没有set方法,spring直接修改field的权限(也就是把private修改为protected或public),然后将field初始化
Spring_注解装配bean&AOP编程
学习参照:[https://www.jianshu.com/p/a89a9563c305]
参照学习:黑马程序员、传智播客视频