Bean实例化的方式
在spring里面通过配置文件创建对象
-
bean实例化三种方式实现
- 使用类的无参数构造创建(重点/主要使用)
<bean id="user" class="com.ljy.spring.User"></bean>
如果类里面没有无参构造则会出错
- 使用静态工厂创建
创建一个静态方法,返回类对象
<!--使用静态工厂创建对象 --> <bean id="bean2" class="com.ljy.spring2.Bean2Factory" factory-method="getBean2"></bean>
- 使用实例工厂创建
创建不是静态的方法,返回类对象
<!--实例工厂创建对象 --> <!--创建工厂对象 --> <bean id = "bean3Factory" class="com.ljy.bean.Bean3Factory"></bean> <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
bean标签常用属性
- id属性
给bean起名字,id属性值名称不能包含特殊符号,根据id得到配置对象 - class属性
创建对象所在的类的全路径 - name属性
跟id属性一样,但是id属性值不能包含特殊符号 但是name属性值里面可以包含特殊符号,不过目前都用id - scope属性
属性值有- singleton:默认值,单例的 对象只能创建一次
- prototype: 多例的 每次创建都是一个新的对象
- request:创建对象把对象放在request域里面
- session:创建对象吧对象放在session里
- globalSession:创建对象把对象放在globalSession里面全局Session 单点登录
属性注入
- 创建对象时候 向类的属性设置值
- 属性注入的方式(三种)
- set注入
- 有参数构造注入
- 接口注入 不常用
- set注入
- spring中只支持前两种方式
1.使用有参构造函数注入(不常用)applicationContex.xml: <!-- 使用有参数构造注入属性 --> <bean id="demo" class="com.ljy.property.PropertyDemo1"> <!-- 使用有参构造 --> <constructor-arg name="username" value="xiaohong"></constructor-arg> </bean>
public class PropertyDemo1 { private String username; public PropertyDemo1(String username) { super(); this.username = username; } public void test1(){ System.out.println("demo1++++"+username); }
}
2.使用set注入
public class Book {
private String bookname;
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public void demobook(){
System.out.println("book:"+bookname);
}
}
<bean id="book" class="com.ljy.property.Book">
<!-- 属性注入 name属性名称 value属性值 -->
<property name="bookname" value="西游记"></property>
</bean>
注入对象类型属性
-
创建 service类和dao类
- 在service得到dao对象:
-
具体实现过程
- 在Service里面擦dao作为类型属性
- 生成dao类型的属性的set方法
public class UserService { //定义一个dao类型属性 private UserDao userDao; //生成set方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
<!-- 注入 对象类型属性--> <bean id="userDao" class="com.ljy.ioc.UserDao"></bean> <bean id="userService" class="com.ljy.ioc.UserService"> <!-- 注入dao对象 现在不用value属性 因为不是字符串 而是对象 而要换做ref属性:dao配置bean标签中id值 --> <property name="userDao" ref="userDao"></property> <!-- 这里创建了userDao的对象 并注入给userService的UserDao类型的属性 --> </bean>
P名称空间注入
public class Person {
private String pname;
public void setPname(String pname) {
this.pname = pname;
}
public void test1(){
System.out.println("person..."+pname);
}
}
<!-- p名称空间注入 -->
<bean id="person" class="com.ljy.property.Person" p:pname="lucy"></bean>
注入复杂类型
- 数组
- list集合
- map集合
- properties类型
<bean id="person" class="com.ljy.property.Person">
<!-- arrs -->
<property name="arrs">
<list>
<value>lily</value>
<value>lucy</value>
<value>jack</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>李四</value>
<value>张三</value>
<value>王五</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="小李"></entry>
<entry key="bb" value="小张"></entry>
<entry key="cc" value="小王"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class Person {
private String pname;
private String[] arrs;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public void setPname(String pname) {
this.pname = pname;
}
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
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;
}
public void test1(){
System.out.println("person..."+pname);
System.out.println("arrs..."+Arrays.toString(arrs));
System.out.println("list..."+list);
System.out.println("map..."+map);
System.out.println("Properties..."+properties);
}
}
输出结果:
IOC和DI的区别
IOC:控制反转,把对象创建交给spring进行配置
DI: 依赖注入, 向类里面的属性注入值
关系:依赖注入不能单独存在,需要在ioc基础之上完成操作
Spring整合web项目
- 加载spring核心配置文件
//加载spring配置文件,根据创建对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContex.xml");
- new对象,功能可以实现,效率很低
- 实现思想:把家在配置文件和创建对象的过程,在服务器启动时候完成
- 实现原理
- ServletContext对象
- 监听器
- 具体使用:
- 在服务器启动时候,为每个项目创建一个ServletContext对象
- 在ServletContext对象创建的时候,使用监听器可以具体到ServletContext对象在什么时候创建
- 使用监听器监听到ServletContext对象创建时候,
- 加载spring配置文件,把配置文件配置对象创建
- 把创建对象放到ServletContext域对象里面(setAttribute方法)
- 获取对象时候,到ServletContext域得到(getAttribute()方法)