Spring第一弹ioc容器

spring 的ioc(控制反转)目的是为了降低代码的耦合度,组件之间的控制由ioc来进行管理

//注,本文章不是技术交流,仅仅作为笔记使用,参考尚硅谷的spring课程,内容上的繆误敬请指正

创建java bean对象、实体类、java bean对象属性的注入(相应变量赋值),通过

IOC底层原理

**第一步:xml配置配置文件,创建配置对象**

		
**第二步:创建工厂类,service类和dao类**

Bean管理(本质是给java bean对象赋值)

第一个:基于xml方式创建配置文件

<bean id=" id名字" class=" java bean对象位置"></bean>
 1. id属性 :标识bean标签的唯一性 
 2. class属性: 指到相应的java bean对象的包的位置 
 3. 相应的java bean对象里面要写set方法,可以引用lombok插件,(别杠 spring in action 5的作者也在用)
 bean标签里面的标签是<property name="变量名" value="变量值" ></property>
 4.第二种是无参构造<constructor-arg name="变量名" value="变量值"></constructor-arg>
 5.P名称注入: 
 		需要相应的添加xmlns的值 xmlns:p="http://www.springframework.org/schema/p"
 		<bean id="id名称" class="包的名字" p:变量名称="变量值" 
		p:变量名称="变量值"></bean>
 6.特殊转义符号
 		null	<property name="变量名称"><null/></property>
 		特殊符号 <property name="address"><value><![CDATA[饱含特殊符号的值]]></value>  </property>
 		              即特殊符号用![CDATA[   ]]包裹
 7.service调用dao的方法(**不需要在service里面new对象**)
 servcie里面
      在service里面创建一个关于dao接口的变量  不要new !然后再写 set方法
 xml里面:
 	  <bean id="id值" class="Service方法的路径地址">
	  <property name="Service里面的属性名称(变量名称)" ref="Dao的实现方法的bean id值"></property>   
	  </bean> 
	 
	 PS:ref相当于外部引入
	 
	<bean id="id值对应上面的dao实现方法" class="DaoImpl实现方法的包类地址"></bean>
 
 	8.给多个对象注入属性(赋值)
  	 	  通俗讲就是一个对象里面的一个属性是一个其他的类,现在要给这个其他类赋值
  	 	  <bean id="id值" class="对象的属性包类路径">
			 <!--设置两个普通属性-->
			 <property name="对象里面的普通变量名称" value="需要赋给的值"></property>
			 <property name="对象里面的普通变量名称" value="需要赋给的值"></property>
			 <!--设置对象类型属性-->
			 
			<property name="对象里面的其他类的变量名称">
			 <bean id="id值" class="对象的属性包类路径">
			 <property name="其他类的变量名称" value="需要赋给的值"></property>
			 </bean>
			 </property>
			
			ps:这个位置的赋值也可以用ref进行外部引入
			
			</bean>
	9.级联赋值
 		1.		  <bean id="id值" class="对象的属性包类路径">
			 <!--设置两个普通属性-->
			 <property name="对象里面的普通变量名称" value="需要赋给的值"></property>
			 <property name="对象里面的普通变量名称" value="需要赋给的值"></property>
			 <!--设置对象类型属性-->
			 
			<property name="对象里面的其他类的变量名称" ref=" 外部bean 的id">
			</bean>
			 <bean id="id值" class="对象的属性包类路径">
			 <property name="其他类的变量名称" value="需要赋给的值"></property>
			 </bean>
			 </property>
		2.需要在类里面生成关于其他类的get方法
			 <property name="其他类**.**其他类里面的属性" value="相应的属性值"></property>
 10,注入集合,
        1.数组
        		<bean id="id" class="路径">

				 <property name="变量变量名称">
				 <array>
				 <value>值1</value>
				 <value>值2</value>
				 </array>
				 </property>
        2.集合
        <property name="变量名称">
		 <list>
		 <value>值1</value>
		 <value>值2</value>
		 </list>
		 </property>
        		
        3.map集合
        			<property name="map变量名称">
				 <map>
				 <entry key="key1" value="值1"></entry>
				 <entry key="key2" value="值2"></entry>
				 </map>
				 </property>
				 <!--set 类型属性注入-->
				 <property name="sets">
		4.set集合
				 <set>
				 <value>值1</value>
				 <value>值2</value>
				 </set>
				 </property>
				</bean>	
		PS:如果是一个类有好几个属性需要将属性写在一个bean标签里面,
		        四个标签区别是value外面的标签是array,list ,map,set
11.集合里面注入对象
		在集合里面设置对象类型值
		<!--创建多个 course 对象--> <bean id="id1" class="路径">
		 <property name="变量名" value="值"></property>
		</bean>
		 <bean id="id2" class="路径">
		 <property name="变量名" value="值"></property>
		</bean>
		<!--注入 list 集合类型,值是对象--> <property name="courseList">
		 <list>
		 <ref bean="id1"></ref>
		 <ref bean="id2"></ref>
		 </list>
		</property>	

12.集合里面提取对象

      (1)在 spring 配置文件中引入名称空间 util
      (2)引入xmlns:util="http://www.springframework.org/schema/util"
                添加		http://www.springframework.org/schema/util 
							http://www.springframework.org/schema/util/spring-util.xsd
	   (3) <util:list id="id1">
	       <value>值1</value>
		 <value>值2</value>
		 </value>
		</util:list>
		<!--2 提取 list 集合类型属性注入使用--> <bean id="id2" class="路径">
		 <property name="变量名" ref="id1对应util的id值"></property>
		</bean>
13.IOC操作bean
  			普通bean和工厂bean的区别是,工厂类bean返回的类型是其他类型的(不同于class路径里面的包 类)
	  					普通bean
					  					contxt.getBan("类1",类1.class)
						工厂类
			  					在类里面 implements 接口的方法,返回的是其他类
			  					解决:在程序里面更改 contxt.getBan("工厂类",返回类.class)
14.单实例和多实例(多实例是相当于每一次都new一个新对象,类似于C语言的两个指针同一个地址和不同地址的区别)
			<bean id="id值" class ="路径" scop="singleton或者prototype"></bean>
  		(3)singleton 和 prototype 区别(不设置默认是singleton)
			第一 singleton 单实例,prototype 多实例
			第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
			设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
			getBean 方法时候创建多实例对象
15.bean的生命周期
		五步生命周期
			(1)第一步执行无参构造方法
			 	通过构造器创建 bean 实例(无参数构造)
			(2)为 bean 的属性设置值和对其他 bean 引用(第二步调用 set 方法)
			(3)调用 bean 的初始化的方法(第三步需要进行配置初始化的方法)
			(4)bean 可以使用了(第四步获取对象,执行的是context.getBan(" ",""))
			(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
			<bean id="id值" class="路径" init-method="包里面的方法" 
			destroy-method="包里面的方法">
			 <property name="变量名字" value="变量值"></property>
			 </bean>
			 初始化方法和销毁方法都需要在相应的包里面写执行函数
	  七步生命周期(后置处理器)
	  			在五步的基础上,加了两步
			  		1.	调用bean初始化方法之前,会把bean实例传给postProcessBeforeInitialization
			  		2.	调用之后传递给了 postProcessAfterInitialization
			  			注意bfore和after
			  		3.	一旦有这个后置处理器,会为xml里面所有的bean都添加这两步方法
			  			<bean id="id" class="类路径"></bean>这个类路径需要implements BeanPostProcessor

第二个:基于注解方式实现

 16.自动装配 	
 					<bean id="id值" class="类路径" autowire="byName">不需要property标签</bean> 	
    					<bean id="id值" class="类路径" autowire="byType">不需要property标签</bean>
    					<bean id="id1" class="com.atguigu.spring5.autowire.Dept"></bean>
    					autowire的byType和byName,byName更好一点 	byType的话,类型相同的bean会报错
  PS:byName名称注入id值要和属性(bean变量名)一样
   			byType类型注入属性 类型(变量属性:String,或者是某一个类的对象名称),
   			class里面的类路径下的名称为一个类型
 17.操作外部属性文件(引入资源文件)
        xmlns添加:
        context="http://www.springframework.org/schema/context"
   		xsi添加
   		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd
 	<context:property-placeholder location="classpath:文件名称.properties"/>
 	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
	 <property name="变量名称" value="${相应名称}"></property>
	</bean>
	操作外部属性文件就是对.properties文件里面的值进行一个输出,${相应名称的形式}

18.注解引入值
	一,	(1)@Component
			(2)@Service
			(3)@Controller
			(4)@Repository
			这四个注解的功能是一样的,都可以用来创建java bean实例,但是习惯用于相应的层面上
						PS:需要引入spring-aop的jar包
						<context:component-scan base-package="包路径"></context:component-scan>
						上面这句话会扫描相应路径的包,对有注解的进行操作
			@Component(value="定义名称"),但是不写value后面自定义的,会默认将包的首字母小写的形式作为value的值
					value值相当于设置bean标签里面的id值
   二,组件扫描
		  	 <context:component-scan base-package="包路径" use-default-filters="false">
			 <context:include-filter type="annotation" 
			 
			expression="org.springframework.stereotype.Controller"/>
			</context:component-scan>
			加了这个default只扫描带有相应注解的类,扫描默认带有相应注解的包Controller
			
			<context:component-scan base-package="包名">
			 <context:exclude-filter type="annotation" 
			 
			expression="org.springframework.stereotype.Controller"/>
			</context:component-scan>
			这个是exculde不包含,include包含,include扫描带有注解的,exclude不扫描带有注解的
19,注解方式实现属性注入
    	 	1.@Autowired
    	 	2.@Qualifier(value="名称")      //一个接口会有多个实现类,类型就会有许多个,从而根据类型注入会报错
    	 												//Qualifier需要和Autowired一起使用
    	 												//这里面的名称是根据@Repository(value = " 自定义实现类的名称")
    	 												Service里面@Qualifier(value="对应上面的Repository的自定义名称")
    	 	3.@Resource 						//既可以类型注入也可以名称注入@Resource 		
    	 												//根据名称注入@Resource(value= " 自定义实现类的名称")
    	 												//resource是java的不是spring里面的
    	 	4.@Value							//字符串单个注入
		@Service
		public class Service{
				  @Autowired
				  //不需要添加set方法,不能new对象,通过Autowired注入对象
				  private Dao dao
		}
@Repository(value= " 自定义实现类的名称")
public class Impl{
				  
		}
@Value(value="123")
private String  name;//这里面name就直接是123

完全注解开发(最好是spring boot)

实际开发是基于spring boot
1. 创建配置类,替代 xml 配置文件
2. @Configuration //作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {“包名”})
public class SpringConfig {
}
ApplicationContext context = new **AnnotationConfigApplicationContext(**SpringConfig.class)

         @Configuration //表明这是一个配置类,替代 xml 配置文件
	    @ComponentScan(basePackages = {"包名"})
	     public class SpringConfig {
	     //对应context里面的(***class文件)
	     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值