Spring01入门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组件中的一个。

在这里插入图片描述
四核心下载地址:
https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring/5.1.0.RELEASE/spring-framework-5.1.0.RELEASE-dist.zip

依赖下载地址:
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]
参照学习:黑马程序员、传智播客视频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值