Spring(二、Spring IOC)
来源:互联网 发布:lua 脚本 java 编辑:程序博客网 时间:2024/05/19 00:50
一、Spring的IOC操作
1、把对象的创建交给spring进行管理2、ioc的操作有两部分操作: (1)ioc里基于配置文件的方式实现 (2)ioc里基于注解的方式实现3、ioc的底层原理里主要使用的技术 (1)xml配置文件 (2)dom4j解析xml (3)工厂设计模式 (4)反射
二、IOC操作(基于XML)
案例:
1、普通的方法调用过程
package com.test;public class User { public void hello() { System.out.println("hello..."); } public static void main(String[] args) { //原始调用方法 User user = new User(); user.hello(); }}
2、使用SpringIOC 调用方法的过程
1、创建项目,导入Spring基本的jar包和commons-logging.jar包
注意:需要同时导入commons-logging.jar包,否则会报错
2、创建spring的配置文件并配置创建的类
(1)spring核心配置文件的名称和位置不是固定的。可以创建多个配置文件。 建议放到src目录下(方便获取),名称没有要求。官方建议名称applicationContext,xml(2)在配置xml文件里,引入schema约束。
配置文件:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置对象 --> <bean id="user" class="com.test.User"></bean>
3、调用:
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");User bean = (User) context.getBean("user");bean.hello();
四、bena标签的常用属性
id :起名称,id属性值名称无要求,可任意命名,用来在项目中查找此bean对象。 --id属性值:不能写中文,不能包含特殊的符号。class :创建对象类的全路径。name :功能和id值一样,id属性值不能包含特殊符号,name中可以包含特殊符号。为了兼容旧版(已弃用)scope :表示创建的对象的特点。 singleton:默认的,对象是单例。 prototype:多例的。request:web项目中,Spring创建一个bean对象,将对象存入到request域中。session:web项目中,Spring创建一个bean对象,将对象存入到session域中。globalSession:web项目中,应用在prolet环境,如果没有prolet环境,那么globalSession相当于session。
五、属性注入介绍
属性注入:在创建对象的时候,对对象的属性设置值。
java代码中,属性注入的方式:(1)有参构的造方式(2)使用set方式注入(3)使用接口注入
Spring框架中,只支持set方法注入和有参数的构造注入。
1、使用有参构造注入属性
package com.test;public class Bean1 { private String userName; public Bean1(String userName) { super(); this.userName = userName; } public void output() { System.out.println("userName: " +userName); }}
配置文件配置参数注入:
<!--使用有参构造注入属性 --><bean id="bean1" class="com.test.Bean1"> <!--name:属性名 value:属性值 --> <constructor-arg name="userName" value="spring"></constructor-arg></bean>
2、使用set方法注入属性(常用)
package com.test;public class Bean2 { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public void output() { System.out.println("userName: " +userName); }}
配置文件配置参数注入:
<!--使用set方法注入属性 --><bean id="bean2" class="com.test.Bean2"> <!--name:类里面定义的属性名 value:设置的属性值 --> <property name="userName" value="spring"></property></bean>
3、注入对象类型属性(重点)
1、创建service类和dao类。
(1)在service中得到dao的对象。
1、在service里,把dao作为一个属性。
2、生成dao的set方法。
package com.test;public class Dao { public void output() { System.out.println("dao output...."); }}
package com.test;public class Service { private Dao userDao; public Dao getUserDao() { return userDao; } //创建set方法,通过set方法注入值。 public void setUserDao(Dao userDao) { this.userDao = userDao; } public void output() { userDao.output(); System.out.println("service output...."); }}
<!--配置service 和dao对象 --><bean id="dao" class="com.test.Dao"></bean><bean id="service" class="com.test.Service"> <!-- ref:引用,要注入哪一个对象,写bean标签的id值 --> <property name="userDao" ref="dao"></property></bean>
//调用输出ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");Service bean = (Service) context.getBean("service");bean.output();
输出结果:
六、注入复杂类型属性
package com.test;import java.util.List;import java.util.Map;import java.util.Properties;import org.junit.Test;public class Bean3 { private String[] arrs; private List<String> list; private Map<String, String> map; private Properties properties; public String[] getArrs() { return arrs; } public void setArrs(String[] arrs) { this.arrs = arrs; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } @Test public void output (){ System.out.println("arrs: " +arrs); System.out.println("list: " +list); System.out.println("map: " +map); System.out.println("properties: " +properties); }}
配置文件配置属性值:
<bean id="bean3" class="com.test.Bean3"> <!--数组 --> <property name="arrs"> <list> <value>wanna</value> <value>luna</value> <value>chen</value> <value>shiki</value> </list> </property> <!--list --> <property name="list"> <list> <value>guangzhou</value> <value>shenzhen</value> <value>zhongshan</value> </list> </property> <!--map --> <property name="map"> <map> <entry key="aa" value="AA"></entry> <entry key="bb" value="BB"></entry> <entry key="cc" value="CC"></entry> </map> </property> <!--properties --> <property name="properties"> <props> <prop key="driverclass">com.mysql.jdbc.driver</prop> <prop key="username">root</prop> <prop key="userpassword">root</prop> </props> </property></bean>
调用输出:
//调用输出ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");Bean3 bean = (Bean3) context.getBean("bean3");bean.output();
输出结果:
七、IOC操作(注解)
1、注解介绍
注解:代码里面的特殊标记,使用注解可以直接完成相关功能。
注解的写法:@注解名称(属性名称=属性值)。如果只有一个属性,则可以省略属性名称 :@注解名称(属性值)
注解使用范围:可以使用在类方面,方法上面,属性上面。
Spring的bean管理(注解)(1)使用注解创建对象(2)使用注解注入属性(3)xml和注解方式混合使用
2、注解创建对象
(1)导入Spring基本jar包和aop包
(2)引入注解相关约束
xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
(3)xml配置,开启注解扫描
<!--开启注解扫描,到包里面扫描类、方法、属性上是否有注解 base-package:扫描的类所在的包名,多个包名之间用逗号隔开 如果有com.test.test1,com.test.test2两个包,则用com.test作为base-package的值也可以 --><context:component-scan base-package="com.test"></context:component-scan><!--只扫描属性上的注解 --><context:annotation-config></context:annotation-config>
(4)注解创建对象
package com.test;import org.springframework.stereotype.Component;@Component(value="bean4") //等同于 <bean id="bean4" class="com.test.Bean4"> </bean>public class Bean4 { public void output() { System.out.println("bean4 output...."); }}
(5)输出
//调用输出ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");Bean4 bean = (Bean4) context.getBean("bean4");bean.output();
创建对象有四个注解:
Spring中提供@component的三个衍生注解:(功能目前来讲是一致的,都创建对象)
@Controller :web层@Service :业务层@Repository :持久层
这三个注解是为了让标注类本身的用途清晰
创建对象是单实例还是多实例(scope注解):
@Component(value="bean4") //等同于 <bean id="bean4" class="com.test.Bean4"> </bean>@Scope(value="prototype") //prototype:多例的 不填写默认为singleton:单例public class Bean4 { public void output() { System.out.println("bean4 output...."); }}
3、注解注入属性
注入属性:@Autowired、@Resource(name=”“),这两种方式都可以实现注入属性。使用resource需要指定name值,name值为UserDao的注解的value值。
Bean4.java
package com.test;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;@Component(value="bean4") //等同于 <bean id="bean4" class="com.test.Bean4"> </bean>@Scope(value="prototype") //prototype:多例的 不填写默认为singleton:单例public class Bean4 { public void output() { System.out.println("bean4 output...."); }}
Bean5.java
package com.test;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;@Controller("bean5")public class Bean5 {// @Autowired @Resource(name="bean4") private Bean4 bean4; public void output () { bean4.output(); System.out.println("bean5 output..."); }}
调用:
//调用输出ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");Bean5 bean = (Bean5) context.getBean("bean5");bean.output();
输出结果:
4、注解和配置文件混合使用
1、创建对象操作使用配置文件方式实现。
2、注入属性的操作使用注解的方式实现。
Bean4.java
public class Bean4 { public void output() { System.out.println("bean4 output...."); }}
Bean5.java
public class Bean5 {// @Autowired @Resource(name="bean4") private Bean4 bean4; public void output () { bean4.output(); System.out.println("bean5 output..."); }}
配置文件:
<bean id="bean4" class="com.test.Bean4"></bean> <bean id="bean5" class="com.test.Bean5"></bean>
调用:
//调用输出ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");Bean5 bean = (Bean5) context.getBean("bean5");bean.output();
输出结果:
- Spring(二、Spring IOC)
- Spring IOC(二)
- Spring IoC 基础 (二)
- Spring IOC AOP (二)
- Spring(二):了解IOC
- Spring源码-IOC(二)
- Spring(二):Spring Ioc简介
- Spring Ioc学习(二)
- Spring—IoC(二)
- Spring(二) IoC
- Spring(二)IOC
- Spring 学习系列-----(二)IoC思想
- Spring核心(二)IoC介绍
- Spring核心(二)IoC介绍
- Spring源码分析----IoC容器(二)
- (二)spring 之IOC容器
- 深入浅出Spring(二) IoC详解
- 深入浅出Spring(二) IoC详解
- 图像的线性分类器(感知机、SVM、Softmax)
- openstack安装RabbitMQ报错,无法启动Rabbit
- 周志华老师推荐机器学习书单
- 一个炫酷的 TabLayout 与 CoordinatorLayout 相结合的自定义控件
- 数据实验7倒置无头节点单链表
- Spring(二、Spring IOC)
- CSS 布局初探
- 运行scrapy框架报错ModuleNotFoundError: No module named 'win32api' ,下载安装包也不行的解决办法。
- XML
- Struts 2入门案例
- XML_DTD
- C++风格_格式
- XML解析
- 基础练习 数列特征