1.IOC容器创建的2种方式

//首先在applicationContext.xml配置文件中写
<bean id="user" name="1ds@@user" class="c_ioc_bean.user"/>//创建方式一:
//Spring把所有的配置文件都当做资源ClassPathResource resource = new ClassPathResource("applicationContext.xml");BeanFactory    beanFactory = new XmlBeanFactory(resource);beanFactory.getBean("user");//创建方式二:
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");ac.getBean("user");//这里AppicationContext是BeanFactory下的接口

2.Bean配置的详解

//User类
package c_ioc_bean;public class user {private String id;private String name;public user() {System.out.println("user.user()");}public void init(){System.out.println("user.init()");}public void destroy(){System.out.println("user.enclosing_method()");}
}<!-- bean的高级配置1.单例/多例通过scope='singleton',scope='prototype'分别来指定默认也是单例的如果是单例,则在ioc容器创建时,就会创建各个单例对象,以后从容器中取都是取这个单例对象如果是多例,则在ioc容器创建后,每次从容器取都会创建一个对象2.延迟初始化(是针对单例对象来说的)lazy-init='default'或lazy-init='false' 表示不启用lazy-init='true'表示启用意思是ioc容器创建后,不会立即创建单例对象,而是当第一次从容器中获取才会创建3.初始化/销毁 方法当bean对象创建后,会调用init-method中指定的初始化方法当销毁容器对象后,会调用destroy-method中指定的bean的销毁方法(此时不能用ApplicationContext接口)Bean声明周期:scope="singleton"1. 如果bean作用域是单例, 看是否延迟初始化1.1 如果没有配置延迟初始化(默认),或lazy-init=false创建容器对象的时候,创建applicationContext.xml配置的所有单例对象1.2 如果配置lzy-init=true在创建容器对象后,在第一次从容器中获取实例时候,才创建对象2. 创建完bean实例,执行init-metho配置的初始化方法3. 当销毁容器对象的时候,即调用ClassPathXmlApplicationContext对象的destroy方法的时候, 执行对象的destroy-method配置的对应方法;表示对象销毁scope="prototype"注意: 如果对象是多例,根lazy-init配置没有关系,影响不到!1. 先创建IOC容器对象2. 每次从容器获取bean,才创建对象3. 创建完对象后,执行初始化方法  (每次创建对象后执行)4. 对象创建完毕5. 容器销毁,执行destroy方法--><bean id="user" name="1ds@@user" class="c_ioc_bean.user" scope="singleton" lazy-init="true" init-method="init" destroy-method="destroy"></bean>

3.spring IOC容器详解

3.1 IOC容器创建对象

3.1.1通过无参构造方法创建对象

    <!-- 1.无参构造方法创建对象 --><bean id="user" class="d_create_object.user"></bean>

3.1.2通过带参数的构造方法创建对象

       <!-- 2.调用有参构造方法创建对象 --><bean id="str" class="java.lang.String"><!-- new String("jack") --><constructor-arg value="jack"></constructor-arg></bean><!-- index 形数下标name  形参的名字注意:index,name二选一即可,也可以一个都不选,但是参数要按顺序写,否则报错type  参数类型值有如下两种赋法value 直接给对象属性赋值ref   引用另外一个对象,这个被引用的对象要写bean配置(即只能引用容器里的值)--><bean id="user2" class="d_create_object.user"><constructor-arg name="id" type="int" value="12"></constructor-arg><constructor-arg index="1" type="String" ref="str"></constructor-arg></bean>

3.1.3通过工厂类创建对象

 public class Factory {//工厂类public static String getStaticInstance(){//静态方法return new String("factory_static");}public String getInstance(){ //非静态方法return new String("factory_no_static");}}

3.1.3.1通过工厂类的静态方法创建对象

       <!-- a.工厂类静态方法 创建对象 --><bean id="user3" class="d_create_object.Factory" factory-method="getStaticInstance"></bean>

3.1.3.2通过工厂类的非静态方法创建对象

     <!-- b.工厂类非静态方法创建对象 --><bean id="factory" class="d_create_object.Factory"></bean><bean id="user4" factory-bean="factory" factory-method="getInstance"></bean>

3.2处理对象依赖关系

何为处理对的依赖关系?何为依赖注入(DI)?
依赖注入就是用来处理对象依赖关系,通俗点就是给对象的属性赋值

3.2.1通过set方式

//javaBean
package e_di;import java.util.List;
import java.util.Map;
import java.util.Properties;public class user {private int id;private String name;private List<Object> list;private Map<Object, Object>map;private Properties prop;public user() {System.out.println("user.user()");}public user(int id, String name) {super();this.id = id;this.name = name;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public void setList(List<Object> list) {this.list = list;}public void setMap(Map<Object, Object> map) {this.map = map;}public void setProp(Properties prop) {this.prop = prop;}public void init(){System.out.println("user.init()");}public void destroy(){System.out.println("user.enclosing_method()");}@Overridepublic String toString() {return "user [id=" + id + ", name=" + name + ", list=" + list + ", map=" + map + ", prop=" + prop + "]";}}<!-- 依赖注入:处理对象的依赖关系,就是给对象的属性赋值--><!-- 构造方法的形式--><bean id="user1" class="e_di.user"><constructor-arg value="1"></constructor-arg><constructor-arg value="jack"></constructor-arg></bean><!-- set方式property  name set方法后面的部分函数名value 基本类型的值ref   引用容器中对象的值--><bean id="user2" class="e_di.user"><property name="id" value="2"></property><property name="name" value="tom"></property></bean><!-- set方式给List,map.Properties赋值--><bean id="user3" class="e_di.user"><property name="list"><list><value>中国</value><value>美国</value><value>日本</value></list></property></bean><bean id="user4" class="e_di.user"><property name="map"><map><entry key="ch" value="中国"></entry><entry key="en" value="美国"></entry></map></property></bean><bean id="user" class="e_di.user"><property name="prop"><props><prop key="ch">中国</prop><prop key="en">美国</prop></props></property></bean>
</beans>

3.2.2内部bean的方式

//内部Bean就是set方式简化版。但是因为是通过bean的内部嵌套定义的,所以缺点是只能一次性使用。 当还需要在其他处使用内部的这些bean时,还需要重新定义
<!-- set方式<bean id="userDao" class="f_in.UserDaoImp"></bean><bean id="userService" class="f_in.UserServiceImp"><property name="userDao" ref="userDao"></property></bean><bean id="userAction" class="f_in.UserAction"><property name="userService" ref="userService"></property></bean>--><!-- 内部bean方式 --><bean id="userAction" class="f_in.UserAction"><property name="userService"><bean class="f_in.UserServiceImp"><property name="userDao"><bean class="f_in.UserDaoImp"></bean></property></bean></property></bean>

3.2.3p名称空间注入

//P名称空间
1.首先要在xml文件顶部的<beans></beans>中引入p名称空间 xmlns:p="http://www.springframework.org/schema/p"
然后
2.再按如下方式写配置<!-- P名字空间1.首先引入p名字空间  xmlns:p="http://www.springframework.org/schema/p"2.然后写配置,就是在每个bean中,在需要的赋值的属性前加个p:,例如需要给userAction的userService属性赋值,然后这个值是引入容器里的对象userService--><bean id="userDao" class="f_in.UserDaoImp"></bean><bean id="userService" class="f_in.UserServiceImp" p:userDao="userDao"></bean><bean id="userAction" class="f_in.UserAction" p:userService="userService"></bean>
</beans>

3.2.4自动装载

 <!-- 自动装载autowire="default"不自动装载1. autowire="byName",会根据setXXX(T obj)方法中对象XX的名字自动去容器中找bean的ID和它相同的对象2. autowire="byType",会根据setXXX(T obj)方法中对象XX的类型自动去容器中找bean的ID和它相同的对象3. 全局配置:在根标签中加default-autowire="XXXX"自动装载的缺点:如果是byType,则配置文件中相同类型的bean只能有一个因为不是手动指定,所以不利于后期维护,所以不推荐使用--><!-- 方式一: autowire="byName"--><bean id="userDao" class="h_auto.UserDaoImp" autowire="byName"></bean><!--方式二:autowire="byType" --><bean id="userService" class="h_auto.UserServiceImp" autowire="byType"></bean><!--方式三:
          方式3: 全局自动装配default-autowire="byType"或者,default-autowire="byName"定义到根节点,表示所有的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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byType">

3.2.5注解

总结:可以简化配置!

@Component   把对象加入ioc容器,对象引用名称是类名,第一个字母小写
@Component(“name”) 把指定名称的对象,加入ioc容器@Repository 同@Component , 主要用于标识加入容器的对象是一个持久层的组件(类)
@Service   同@Component , 主要用于标识加入容器的对象是一个业务逻辑层的组件
@Controller 同@Component , 主要用于标识加入容器的对象是一个控制层的组件@Resource 注入属性(DI),  会从容器中找对象注入到@Resource修饰的对象上!<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 使用注解优化上面 --><!-- 步骤:1. 引入context名称空间2. 开启注解扫描3. 使用注解--><context:component-scan base-package="cn.itcast.h_anno"></context:component-scan>    </beans>     @Repository
public class UserDao implements IUserDao {@Overridepublic void save() {System.out.println("UserDao.save(), annotation");}
}@Service
public class UserService implements IUserService {@Resource        // 根据下面属性名称,去容器里面找对应的对象, 找到后注入进来private IUserDao userDao;@Overridepublic void save() {userDao.save();}
}@Controller
@Scope("prototype")   // 指定为多例, 默认为singleton
public class UserAction {@Resourceprivate IUserService userService;public String execute() {userService.save();return "success";}
}

注解与配置的各自优点:

注解,简化配置,开发快捷高效!

配置,开发繁琐、配置麻烦,容易维护!

转载于:https://www.cnblogs.com/chenny3/p/10226218.html

Spring框架知识要点总结(第一天)相关推荐

  1. Spring框架知识复习之二

    Spring使用注解对Bean进行管理 1 使用注解需配置aop相关xsd文件的约束和命名空间 xsd文件名为:spring-aop-4.2.xsd 2 注解组件扫描配置 示例如下:base-pack ...

  2. Spring框架知识

    1.Spring框架讲解 1.1Spring介绍 Spring框架是针对bean的生命周期进行管理的轻量级容器,其中核心技术IOC和AOP. 1.2传统开发存在的问题 宠物对象对于当前的用户紧紧地绑定 ...

  3. java代码审计_Java代码审计| Spring框架思路篇

    Java的WEB框架是Java进阶课程,当要进行Spring的漏洞分析,要有一定的Java代码知识储备. Java后端标准的学习路线:JavaSE->JavaEE->Java Web框架 ...

  4. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...

    Java Web程序中利用Spring框架返回JSON格式的日期 返回Json时格式化日期Date第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@Respo ...

  5. 2022年Java应届生面试之Spring框架基础知识

    前言:工作的原因,最近没有及时更新相关系列.很抱歉!在复习Spring框架的同时也别忘了j2ee的相关知识理论wo~ 大家好!我是JAVA 中的Spring框架,我是一个开源的容器性质的轻量级框架. ...

  6. Spring框架面试精华知识

    咳咳,这里整理一些关于WEB框架的一些知识点,来帮助更多的人进行面试,主要的还是讲解一些关于目前企业用得比较流行的框架,还有就是一些比较前沿的框架,比如阿里开源的Dubbo框架及其开源框架Zookee ...

  7. Spring之AOP的切点、通知、切点表达式以及知识要点

    1.2.1.需要编写的内容 编写核心业务代码(目标类的目标方法) 编写切面类,切面类中有通知(增强功能方法) 在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合 1.2.2.AOP 技术实现 ...

  8. Spring框架基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-spring-framework/ Spring框架简介 Spring , 一个开源的框架 , ...

  9. spring框架搭建第一天

    文章目录 1. 从jdbc的标准代码了解程序的耦合性 简单理解耦合:程序之间的依赖关系 2. 基本的三层 dao层 service层 模拟的controller层(servlet) 存在的问题 3. ...

最新文章

  1. Android Studio - HPROF文件查看和分析工具
  2. PostgreSQL JDBC SQLWarning
  3. fancybox去除不受待见的水平滚动条
  4. html里嵌入语音,HTML5语音合成API语音/语言支持
  5. RTX5 | 事件标志组02 - 置位事件标志组,并获取事件标志组的值
  6. 芯片内部长啥样?牛人用1500张照片,一层层放给你
  7. gem install 和 bundle 区别
  8. html是执行语言吗,HTML的基本语言
  9. pandas to_sql
  10. 小米/VIVO/OPPO全系列救砖+解锁+工具+教程+激活账户技术
  11. FANUC数控系统应用中心
  12. 重装系统显示缺少计算机所需的介质驱动程序,安装WIN7提示“缺少所需的CD/DVD驱动器设备驱动程序”的解决办法...
  13. 推荐系统之itemCF
  14. 安全继电器原理及接法
  15. 计算机专业的求职信英文版带翻译,[求职信英语作文带翻译]求职信的英语作文4篇...
  16. CCIE一年后的心语
  17. 一文告诉你,SIMULIA/Abaqus究竟有多强大
  18. nginx参数sendfile
  19. 阿松和阿柏无事闲聊互道岁月不饶人
  20. OO第三单元——规格化设计与地铁系统——总结

热门文章

  1. OpenCV-python学习笔记(五)——shreshoding阈值化
  2. mysql读写分离的含义_mysql的读写分离问题剖析
  3. 安装python扩展库时只能使用pip_使用pip安装Python扩展库的方法
  4. python判断成绩情况
  5. android控件在同一水平,android – 在linearlayout中水平对齐按钮,间距相等
  6. debian php mysql 包_debian php mysql
  7. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下降3.29%
  8. PoolTogether本周Loot Box奖金组合中新增加入ESSAY代币
  9. 风控五大模型、三大风险指的是什么--几大模型PD、LGD、评分模型都有哪些细节点
  10. windows10系统右键新建菜单的自定义