第一种管理bean的方式:xml
bean实例化的方式
1、在spring里面通过配置文件创建对象
2、bean实例化三种方式实现
第一种:使用类的无参数构造创建(重点)
类默认是无参数构造,写了含参数构造后需要声明无参数构造
<bean id="user" class="x.y.User"></bean>
第二种:使用静态工厂(静态方法)创建
普通类:
public class Bean2{
public void add(){
system.out.println("add.....");
}
}
工厂类:
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}
}
xml中bean的书写:
<bean id="bean2" class="x.y.Bean2Factory" factory-method="getBean2"></bean>
第三种:使用实例工厂(普通方法)创建
普通类:
public class Bean3{
public void add(){
system.out.println("add.....");
}
}
工厂类:
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
}
}
xml中bean的书写:
<bean id="bean3Factory" class="x.y.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
bean标签常用属性
1、id属性(理论上可以为任意名字,但不能包含特殊字符)
根据id值得到配置对象
2、class属性(创建对象所在类的全路径)
3、name属性(功能和id属性一样的,id属性值不能包含特殊字符,name属性值中可以包含特殊字符)
4、scope属性(Bean的作用域)
.singleton 单例(每次创建都是一个对象)
.prototype 多例(每次创建都生成新的对象)
.request (创建的对象放在request域中)
.session (创建的对象放在session域中)
.globalSession (创建的对象放在globalSession域中):全局会话,一次登录可以在所有的产品中使用,例如单点登录
属性注入
1、创建对象时,向类里面的属性中设置值
2、属性的注入方式介绍(三种方式)
第一种:使用set方式注入
第二种:使用有参数构造注入
第三种:使用接口注入
3、spring中属性注入方式仅支持前两种
第一种:使用set方式注入(最常用)
普通类:
public class PropertiesDemo2{
private String username;
public void setUsername(String name){
this.username = name;
}
}
xml中的书写:
<bean id="propertiesDemo2" class="x.y.PropertiesDemo2">
<!--注入属性值
name:类里面定义的属性名称
value:设置具体的值
-->
<property name="username" value="小王"></property>
</bean>
第二种:使用有参数构造注入
普通类:
public class PropertiesDemo1{
private String username;
public propertiesDemo1(String name){
this.username = name;
}
}
xml中的书写:
<bean id="demo1" class="x.y.PropertiesDemo1">
<constructor-arg name="username" value="小马"></constructor-arg>
</bean>
注入对象类型属性(重点)
1、创建service类和dao类,在service中得到dao对象
2、具体实现过程
(1)在service中把dao作为类型属性
(2)生成dao类型属性的service方法
普通类:
public class Dao{
public void add(){
system.out.println("dao");
}
}
public class Service{
private Dao dao;
public void setDao(Dao dao){
this.dao = dao
}
public void add(){
system.out.println("service");
dao.add();
}
}
xml书写:
<bean id="dao" class="x.y.Dao"></bean>
<bean id="service" class="x.y.Service">
<!-- name:类中的属性名称 ref:引用的对象的id值 -->
<property name="dao" ref="dao"></property>
</bean>
p名称空间注入
参考:https://www.cnblogs.com/Smile-123/p/5993599.html
注入复杂类型属性
.数组类型
.list类型
.map类型
.properties类型
普通类:
public class Person {
private String[] arrayStr;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public void setArrayStr(String[] arrayStr) {
this.arrayStr = arrayStr;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
xml书写:
<bean id="person" class="x.y.Person">
<!-- 数组 -->
<property name="arrayStr">
<list>
<value>小王</value>
<value>小李</value>
<value>小马</value>
</list>
</property>
<!-- list -->
<property name="arrayStr">
<list>
<value>小张</value>
<value>小孙</value>
<value>小郑</value>
</list>
</property>
<property name="map">
<map>
<Entry key="aa" value="Lucy"></Entry>
<Entry key="bb" value="Damo"></Entry>
<Entry key="cc" value="John"></Entry>
</map>
</property>
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<property key="username">root</property>
</props>
</property>
</bean>
IOC和DI的区别
spring整合Web项目原理
1、加载spring核心配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
此语句是new方式创建对象,功能实现,效率很低
2、解决上述问题的实现思想:把加载配置文件和创建对象的过程,在服务器启动的时候完成。
3、解决上述问题的实现原理
用到的技术:
(1)servletContext对象
(2)监听器(servletContextListener)
具体使用:
.在服务器启动的时候,为每个项目创建一个servletContext对象
.在servletContext对象创建的时候,使用监听器监听到servletContext对象的创建时间,此时加载
spring核心配置文件,同时实现配置文件的配置对象创建,把创建出来的对象放到
servletContext域对象里面(setAttribute方法),获取对象的时候从servletContext域中得到(getAttribute方法)
第二种管理Bean的方式:注解
注解
1、代码里面的特殊标记,使用注解可以完成功能
2、注解写法:@注解名称(属性名称=属性值)
3、注解可以使用在类上面、属性上面、方法
spring注解准备工作
1、导入jar包
(1)导入基本的jar包(见:http://blog.csdn.net/mameng1988/article/details/78987619)
(2)导入aop的jar包(spring-aop-4.3.9.RELEASE.jar)
2、创建类、方法
3、创建spring核心配置文件,引入约束
(1)IOC基本功能时引入约束beans
(2)做spring的ioc注解开发,引入新的约束context
4、开启注解扫描
在spring核心配置文件xml中书写:
<!-- 开启注解扫描(最常用)到包里面扫面类、方法、属性上面是否有注解 -->
<context:component-scan base-package="x.y" ></context:component-scan>
<!-- 仅扫面属性上面的注解 -->
<context:annotation-config></context:annotation-config>
注解创建对象
1、在需要创建对象的类上面使用注解实现
2、创建对象有四个注解
spring中提供@Component的三个衍生注解(功能目前来讲是一致的)
.@Controller :Web层
.@Service :业务层
.@Repository :持久层
这三个注解是为了让标注类本身的用途清晰,spring在后续版本会对其增强
3、创建对象是单例还是多例(默认是单例)
注解注入属性
1、创建service类,创建dao类,在service中得到dao对象
(1)创建dao和service对象
(2)在service类里面定义dao类型属性
注入属性的第一个注解@Autowired:根据类名找到类对应的对象
注入属性的第二个注解@Resource(name="userDao")
配置文件和注解混合使用
1、创建对象操作使用配置文件方式实现
2、注入属性的操作使用注解的方式实现