spring项目属性注入和bean管理xml 注入一般属性和集合属性
IOC
介绍:
在Spring的应用中,Spring IoC容器可以创建、装配和配置应用组件对象,这里的组件对象称为Bean。
Bean的实例化
在面向对象编程中,想使用某个对象时,需要事先实例化该对象。同样,在Spring框架中,想使用Spring容器中的Bean,也需要实例化Bean。Spring框架实例化Bean有3种方式:构造方法实例化、静态工厂实例化和实例工厂实例化,其中,最常用的实例方法是构造方法实例化。
创建配置类
在应用的src目录下,创建config包,并在该包中创建配置类JavaConfig。在该配置类中使用@Bean定义3个Bean,具体代码如下:
IOC操作bean管理(普通bean)
spring有两种类型bean,一种普通bean,另外一种工厂bean
普通bean:在配置文件中定义的什么类型就返回什么类型,工厂bean:返回的类型可以不是定义的类型
目前创建项目后文件目录:
导入的jar包五个:
这次下载的是5.2.6版本,用到了四个spring的jar包,是ioc需要的至少四个,直接jar包复制后新建lib文件夹,再粘贴到目录下,再手动添加jar包:
spring的官网地址:
https://repo.spring.io/release/org/springframework/spring/
common-logging-1.1.jar的下载地址:
https://mvnrepository.com/artifact/commons-logging/commons-logging/1.1
各个类中的代码:
Emp.java:
package com.company.bean;public class Emp {private String ename;private String gender;
//员工属于某个部门private Dept dept;public void setDept(Dept dept) {this.dept = dept;}public void setEname(String ename) {this.ename = ename;}public void setGender(String gender) {this.gender = gender;}
//一个用于测试的方法public void testt(){System.out.println(ename+" 性别"+gender+" "+dept);}public Dept getDept() {return dept;}
}
Dept.java:
package com.company.bean;public class Dept {private String dname;public void setDname(String dname) {this.dname = dname;}@Overridepublic String toString() {return"部门是:" + dname + '\'';}public String getDname(){return dname;}
}
Userservice.java:
package com.company.service;import com.company.dao.UserDao;
import com.company.dao.UserDaoimp;public class Userservice {//创建userdao类属性private UserDao userdao;public void setUserdao(UserDao userdao) {this.userdao = userdao;}public void add(){System.out.println("servicee add..");userdao.update();}public void setUserDao(UserDaoimp userDao) {this.userdao=userDao;}
}
Testdemo.java:
package com.company.spring5.testdemo;import com.company.bean.Emp;
import com.company.service.Userservice;
import com.company.spring5.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testdemo {@Testpublic void testAdd(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Userservice userservice = context.getBean("userservice", Userservice.class);userservice.add();}@Testpublic void testbean2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Emp emp=context.getBean("emp",Emp.class);emp.testt();}@Testpublic void testbean3(){ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");Emp emp=context.getBean("emp",Emp.class);emp.testt();}}
bean2.xml:
<?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 https://www.springframework.org/schema/util/spring-util.xsd">
<bean id = "userservice" class="com.company.service.Userservice">
<!-- 注入userdao对象,name属性:类里面属性名称-->
<!-- ref属性:创建userdao对象bean标签的id值--><property name="UserDao" ref="userdaoimp"></property>
</bean><bean id = "userdaoimp" class="com.company.dao.UserDaoimp"></bean></beans>
UserDaoimp.java:
package com.company.dao;public class UserDaoimp implements UserDao{@Overridepublic void update() {System.out.println("overider update");}
}
内部bean(嵌套写法)和级联赋值
第一种写法。内部bean
bean3.xml:
<?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--><bean id="emp" class="com.company.bean.Emp"><property name="ename" value="lucy"></property><property name="dept"><bean id="dept" class="com.company.bean.Dept"><property name="dname" value="财务部"></property>
<!-- 嵌套写法,在一个bean中嵌套另一个bean--></bean></property><property name="gender" value="女"></property></bean>
</beans>
注入属性–级联赋值
<bean id="emp" class="com.company.bean.Emp"><property name="ename" value="lucy"></property><property name="dept" ref="dept"></property><property name="gender" value="女"></property>
<!-- 级联赋值:通过外部bean的方式引入,给属性赋值--></bean><bean id="dept" class="com.company.bean.Dept"><property name="dname" value="人事部"></property></bean>
结果:
级联赋值的第二种写法。直接在属性中注入:
bean4.xml:
<bean id="emp" class="com.company.bean.Emp"><property name="ename" value="lucy"></property><property name="dept" ref="dept"></property><property name="dept.dname" value="人事部门之deptname"></property> <!--这种方法注入属性需要在Ept类中实现对Dept使用getter方法才可以使用--><property name="gender" value="女"></property>
</bean><bean id="dept" class="com.company.bean.Dept"><property name="dname" value="Caiwu"></property></bean>
且在Emp中加上:
public Dept getDept() {return dept;}
结果:
xml注入集合属性
1.注入数组类型
2.注入list集合类型
3.注入map类型属性
创建类,定义不同类型的属性
现在的目录:
Testdemo1.Java
package testdemo;import collection.Stu;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testdemo1 {@Testpublic void testvalue(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Stu stu= context.getBean("stu", Stu.class);stu.ontest();}
}
Stu.java:
package collection;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;public class Stu {private String[] lesson;//属性 课程(有多门课程)public void setLesson(String[] lesson){this.lesson=lesson;}private List<String> newlist;//list类型的属性private Map<String,String> newmap;//Map类型的属性private Set<String>newset;public void setNewlist(List<String> newlist) {this.newlist = newlist;//setter方法}public void setNewset(Set<String> newset) {this.newset = newset;}public void setNewmap(Map<String, String> newmap) {this.newmap = newmap;}public void ontest(){System.out.println(Arrays.toString(lesson));System.out.println(newlist);System.out.println(newmap);System.out.println(newset);}
}
bean1.xml:
<?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="stu" class="collection.Stu"><property name="lesson" ><array><value>语文</value><value>数学</value><value>english</value></array></property><property name="newlist"><list><value>list1</value><value>list2</value><value>list3</value></list></property><property name="newmap"><map><entry key="张三" value="第一名"></entry><entry key="李四" value="第二名"></entry><entry key="王五" value="第三名"></entry></map></property><property name="newset"><set><value>c语言</value><value>Java</value><value>html</value><value>css</value></set></property>
</bean>
</beans>
结果:
IOC操作工厂bean
第一步:创建类,让这个类作为工厂bean,实现接口factorybean
第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
先创建一个类:
package factorybean;public class Mybean {@Overridepublic String toString() {return "Mybean{}";}
}
bean2.xml进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:util="http://www.springframework.org/schema/util"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="mybook" class="factorybean.Mybean"></bean>
</beans>
测试类:
@Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Mybean mybook = context.getBean("mybook", Mybean.class);System.out.println(mybook);}
结果:
工厂bean设置返回的bean:
public class Mybean implements FactoryBean<Dept> {@Override//定义返回的beanpublic Dept getObject() throws Exception {Dept dept = new Dept();dept.setDname("财务");return dept;}
测试类:
@Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Dept dept = context.getBean("mybook", Dept.class);System.out.println(dept);}
注意这句话 Dept dept = context.getBean(“mybook”, Dept.class);中的"mybook"跟
<bean id="mybook" class="factorybean.Mybean">
</bean>
中的id是对应的关系,否则会报错。
Dept类:
package com.company.bean;public class Dept {private String dname;public void setDname(String dname) {this.dname = dname;}@Overridepublic String toString() {return"部门是:" + dname + '\'';}public String getDname(){return dname;}
}
bean作用域
在spring里面,默认情况下是单实例对象
可以测试:
@Testpublic void testvalue(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Stu stu= context.getBean("stu", Stu.class);Stu stu2 = context.getBean("stu",Stu.class);stu.ontest();stu2.ontest();}
运行后:
可以发现输出的内容是相同的,如果没有tostring方法,输出的地址是相同的,也可以证明是单实例
singleton单实例 prototype多实例
<bean id="stu" class="collection.Stu" scope="prototype">
设置为多实例对象
bean生命周期
(1)通过构造器创建bean实例(无参数构造),
(2)为bean的属性设置值和对其他bean的引用(调用set方法)
(3)调用bean的初始化方法(需要进行配置)
(4)bean可以使用了(对象获取到了0
(5)当容器关闭的时候,调用bean的销毁方法
代码: 在bean包下创建类:
package com.company.bean;import org.w3c.dom.ls.LSOutput;public class Orders {public Orders() {System.out.println("第一步创建对象");}private String oname;public void setOname(String oname) {this.oname = oname;System.out.println("第二步调用set方法设置属性值");;}public void initmethod(){System.out.println("执行初始化");}public void destroymethod(){System.out.println("执行销毁");}
}
bean3.xml:
<?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="orders" class="com.company.bean.Orders" init-method="initmethod" destroy-method="destroymethod"><property name="oname" value="手机" />
</bean>
</beans>
测试类:
@Testpublic void test3(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Orders orders = context.getBean("orders", Orders.class);System.out.println("第四步 获取创建bean实例对象");System.out.println(orders);((ClassPathXmlApplicationContext)context).close();}
xml自动装配
什么是自动装配:根据指定装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入
<!--实现自动装配
bean标签 autowire属性
配置自动装配autorire属性常用两个值:byNane根据属性名称注入,注入值bean的id值和类属性名称一样
bype根据属性类型注入--><bean id= “emp" class= "com.company.bean. Emp" autowired="byType">.
<!--property name=" dept" ref ="dept"></property>--></bean>
<bean id ="dept"class="com.company.bean.Dept"</bean>
bean管理操作有两种方式:基于xml配置文件实现和基于注解方式实现
引入外部属性文件:
基于注解的方式实现对象创建
第一步 引入aop依赖
第二步 开启组件扫描
如果扫描多个包,可以多个包用逗号隔开,也可以扫描上层目录
<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<context:component-scan base-package="com"></context:component-scan>
</beans>
四个注解:
1.@Component @Component 是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
2.@Controller @Controller对应表现层的Bean,.
3.@ Service @Service对应的是业务层Bean
4.@ Repository @Repository对应数据访问层Bean ,
这四个注解功能是一样的都能实现创建bean实例,只是在写代码时为了方便项目管理出于开发习惯才这样区分
基于注解方式实现属性注入
@Autowired:根据属性类型进行自动装配
@Qualifier:根据属性名称进行注入
@Resource: 可以根据类型注入也可以根据名称注入
@Value: 注入普通类型属性
@servicepublic class UserService{//定义dao类型属性
//不需要添加set方法
//添加注入属性注解@Autowiredprivate UserDao userDao;publie void add(){System.out.printIn("service add.."
);userDao. add();
}
用Autowierd注入属性实例:
先导入aop的jar包
xml文件:
<?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"xmlns:aop="http://www.springframework.org/schema/aop"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
"><context:component-scan base-package="com.company"></context:component-scan>
</beans>
dao层:
package com.company.dao;public interface UserDao {//public void add;public void update();
}package com.company.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoimp implements UserDao{@Overridepublic void update() {System.out.println("overider update");}
}
service层:
package com.company.service;
import com.company.dao.UserDao;
import com.company.dao.UserDaoimp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;
@Repository
public class Userservice {//创建userdao类属性@Autowiredprivate UserDao userdao;public void add(){System.out.println("service add");userdao.update();}
测试:
@Testpublic void Testservice(){ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");Userservice userservice = context.getBean("userservice",Userservice.class);System.out.println(userservice);userservice.add();}
结果:
value注入实例:
@Value(value="你好")private String name;public void add(){System.out.println("service add"+name);userdao.update();
再次运行测试类结果:
AOP
Spring MVC是一款优秀的基于MVC思想的应用框架,它是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。Spring MVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成,总结出Spring MVC的工作流程如下:
(1)客户端请求提交到DispatcherServlet。
(2)由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller。
(3)DispatcherServlet将请求提交到Controller。
(4)Controller调用业务逻辑处理后,返回ModelAndView。 (5)DispatcherServlet寻找一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
(6)视图负责将结果显示到客户端。
patcherServlet将请求分发给Controller之前,需要借助于Spring MVC提供的HandlerMapping定位到具体的Controller。 HandlerMapping接口负责完成客户请求到Controller映射。 Controller接口将处理用户请求,这和Java Servlet扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观角度考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。 ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从而将相应结果渲染给客户。
基于注解的控制器
在使用Spring MVC进行Web应用开发时,**Controller是Web应用的核心。Controller实现类包含了对用户请求的处理逻辑,是用户请求和业务逻辑之间的“桥梁”,**是Spring MVC框架的核心部分,负责具体的业务逻辑处理。
AOP(概念)
1、什么是AOP
(1)面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得
业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
(2)通俗描述:不通过修改源代码方式,在主千功能里面添加新功能
(3)使用登录例子说明AOP
Controller注解类型
在Spring MVC中,使用org.springframework.stereotype.Controller注解类型声明某类的实例是一个控制器
AOP底层使用动态代理
第一种有接口,使用JDK动态代理
1.使用proxy类里面的方法创建代理对象
第二种没有接口,使用CGLIB动态代理
spring项目属性注入和bean管理xml 注入一般属性和集合属性相关推荐
- Spring——Bean管理-xml方式进行属性注入
目录 一.xml方式创建对象 二.xml方式注入属性 第①种方式注入:set方法注入 第②种方式注入:有参构造函数注入 constructor-arg:通过构造函数注入 用name标签属性: 不按照顺 ...
- IOC操作Bean管理XML方式(注入集合类型属性)
目录 IOC操作Bean管理XML方式(注入集合类型属性) (1)首先进行环境的搭建和准备 (2)创建一个类:用来完成集合类型属性注入 (3)在Spring 配置文件进行配置 (4)编写一个测试类进行 ...
- IOC操作Bean管理XML方式(有参构造注入属性)
IOC操作Bean管理XML方式 目录 有参构造注入属性 (1)步骤(创建类,定义属性,创建属性对应的有参构造方法): (2)步骤:在Spring 的xml配置文件中进行配置 (3)步骤:进行测试 结 ...
- IOC操作Bean管理XML方式(外部属性文件)
目录 IOC操作Bean管理XML方式(外部属性文件) 前情引入: 实验演示: 1.直接配置数据库信息 (1)配置德鲁伊连接池 (2)引入德鲁伊连接池jar包 (3)创建一个bean6.xml配置文件 ...
- IOC操作Bean管理XML方式(注入空值和特殊符号)
IOC操作Bean管理XML方式(注入空值和特殊符号) 目录 IOC操作Bean管理XML方式(注入空值和特殊符号) (1)通过null标签注入空值: 标签注入空值 (2)属性值中包含特殊符号: 方法 ...
- IOC操作Bean管理XML方式(xml自动装配)
目录 IOC操作Bean管理XML方式(xml自动装配) 一.演示自动装配过程 (1)根据 属性名称 装配 步骤一: 步骤二: 步骤三: (2)根据 属性类型 装配 (2.1)根据 类型 自动装配产生 ...
- IOC操作Bean管理XML方式(bean 的生命周期)
目录 IOC操作Bean管理XML方式(bean 的生命周期) 1.bean 的生命周期(在单例模式下的生命周期) (1)通过构造器创建 bean 的实例(执行类中无参构造方法去创建对象) (2)为 ...
- IOC操作Bean管理XML方式(bean的作用域)
目录 IOC操作Bean管理XML方式(bean的作用域) 1.在Spring 里面,设置创建 bean 实例是单实例还是多实例的方式 (1)在Spring 配置文件bean 标签里面有属性(scop ...
- IOC操作Bean管理XML方式(FactoryBean)
目录 IOC操作Bean管理XML方式(FactoryBean) Spring 有两种类型的bean 第一种:是普通的 bean 第二种:工厂bean FactoryBean 第一步:创建类,让这个类 ...
最新文章
- python include_tag_详解Python的Django框架中inclusion_tag的使用
- seaborn clustermap详解及绘制
- 使用百度地图结合GPS进行定位
- ffplay flv mp4 转_FFmpeg将mp4转成flv
- boost::hana::map_用法的测试程序
- 报名|腾讯技术开放日·5G技术专场
- 【11.5校内测试】【倒计时5天】【DP】【二分+贪心check】【推式子化简+线段树】...
- 北妈每日总结: 2019年前端人必须学会写博客
- 消息中间件 rabbitMQ
- spring学习笔记一(基于xml)
- python 抓取行政区划
- vue中使用阿里图标
- EGO1—UART串行接口设计及通信的实现
- R语言KNN分类问题(kknn/class包在iris数据集上的实例)
- 对往届软件工程的思考——写在软件工程开课之际 by 姜健
- 2021年焊工(初级)考试题及焊工(初级)考试报名
- 详解低延时高音质:回声消除与降噪篇
- Android查询通讯录信息
- PHP+MYSQL 用户注册登录代码
- 异质化社群量化研究4丨RATE OF CHANGE WITH BANDS
热门文章
- 浅谈python_浅谈python-Django
- 光感是什么_Olay5款热门精华:淡斑小白瓶VS光感小白瓶如何选?超A瓶不太A
- python graphql query返回一组字典数据_Python的sqlalchemy使用原生sql查询如何返回字典形式的数组?...
- 深圳职业技术学院计算机工程学院江学锋,毕业论文附属材料07013505刘丽.doc
- 属于c语言高级参数的,c语言可变参数的取值
- linux dd命令制作软盘,制作Linux启动软盘的四种方法
- Mysql -uroot -p 登陆不上_MySQL命令行登陆,远程登陆MySQL 的方法
- 手机cpu排行_鲁大师手机芯片排行榜:麒麟990第四,骁龙855第五!
- 周期三角波傅里叶级数例题_如何理解傅里叶级数
- 物理化学 焓变的计算和相变焓