spring
概念:将bean对象创建的权力交给spring容器(IOC 控制反转),需要使用对象时调用容器对象的方法去获取,通过spring配置文件去配置对象的类及唯一id标识,spring内部通过反射方式创建出对象并返回
入门
使用步骤(创建maven工程)
1.maven导入jar包坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.3.RELEASE</version>
</dependency>
2.创建并配置spring配置文件(一般为applicationContext.xml)
配置文件核心
bean标签
示例:
<bean id="userDao" class="dao.imp.UserDaoImp" init-method="init" destroy-method="destroy"/>
属性
** id为对象的唯一标识
** class为类的全包名
** init-method 为对象创建之后执行的方法
** destroy-method 对象销毁前执行的方法
** scope 对象的作用范围
** 属性 singleton 默认的 单例模式(只会创建一次,多次获取的是同一个,
在容器中,容器销毁,对象销毁,跟随容器对象一起创建)
** prototype 多例模式(每次获取都会创建,不在容器中,长时间不使用被垃圾回收,在取得时候被创建)
bean实例化得三种方式
1.通过类得无参构造(默认)
<bean id="userDao" class="dao.imp.UserDaoImp"/>
2.通过静态工厂
<bean id="userDao" class="factory.factoryStatic" factory-method="getUserDao"/>
** factory-method 告知容器在需要获取相应id对象时通过此方法返回对象(通过反射)
// 工厂类的方法
public static UserDao getUserDao(){
return new UserDaoImp();
}
3.通过工厂实例方法
<bean id="factoryUnStatic" class="factory.factoryUnStatic"/>
<bean id="userDao" factory-bean="factoryUnStatic" factory-method="getUserDao"/>
** 非静态方法需要通过实例对象来调用,第一步创建工厂实例对象,然后引用实例对象来对用工厂方法
//工厂类的方法
public UserDao getUserDao(){
return new UserDaoImp();
}
** 下面俩种通常用于无法使用无参构造创建对象的情况(如JDBC)
依赖注入
在容器内部为实例对象注入属性,如web层调用业务逻辑层,业务逻辑层又调用DAO层,可以实现将dao层实
例对象注入到业务逻辑层内部属性中,在业务逻辑层内部可以直接通过属性来调用dao层的方法
俩种方式(属性即为set方法后面大写变小写)
1.通过set方法
<bean id="userService" class="service.imp.UserServiceImp">
<property name="userDao" ref="userDao"/>
</bean>
** name为类的属性名 ref 为对象的引用
//通过p命名空间的简写
//需要在beans标签引入 xmlns:p="http://www.springframework.org/schema/p"
<bean id="userService" class="service.imp.UserServiceImp" p:userDao-ref="userDao"/>
2.通过有参构造
<bean id="userService" class="service.imp.UserServiceImp">
<constructor-arg name="userDao" ref="userDao"/>
</bean>
为对象注入其它类型属性(普通数据类型,list,map,Properties)
示例
UserDaoImp类中的属性(其余为对应的get和set方法)
private String name;
private List<String> list;
private Properties properties;
private Map<String, User> map;
User类中的属性
private String name;
private int age;
//配置两个user对象
<bean id="user1" class="domin.User">
<property name="name" value="张三"/>
<property name="age" value="20"/>
</bean>
<bean id="user2" class="domin.User">
<property name="age" value="15"/>
<property name="name" value="李四"/>
</bean>
---------------------------------------------------------------
<bean id="userDao" class="dao.imp.UserDaoImp">
<property name="name" value="张三"/>
// 普通数据类型 name为属性名 value为属性值
<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
// list集合 在list标签配置 数据类型用value
<property name="map">
<map>
<entry key="u1" value-ref="user1"/>
<entry key="u2" value-ref="user2"/>
</map>
</property>
// map集合 map标签内设置 entry为对应的每个键值对 通过key value属性 只要有ref就是对象引用
<property name="properties">
<props>
<prop key="张三">20</prop>
<prop key="李四">22</prop>
</props>
</property>
// properties集合 在props内配置 每个prop为一个属性对
</bean>
----------------------------------------------------------------------------------------
// 下面为通过有参构造注入,将property换成constructor-arg即可
<bean id="userDao2" class="dao.imp.UserDaoImp">
<constructor-arg name="name" value="李四"/>
<constructor-arg name="list">
<list>
<value>1</value>
<value>2</value>
</list>
</constructor-arg>
<constructor-arg name="map">
<map>
<entry key="u1" value-ref="user1"/>
<entry key="u2" value-ref="user2"/>
</map>
</constructor-arg>
<constructor-arg name="properties">
<props>
<prop key="张三">12</prop>
<prop key="李四">13</prop>
</props>
</constructor-arg>
</bean>
如果配置文件比较大,可以使用import导入
<import resource="需要导入的配置文件名"/>
spring API
通过spring获取对象的示例
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) app.getBean("userService");
// 或 UserService userService = app.getBean(UserService.class);
userService.save(); // 调用UserService 类的save方法
1.第一步为获取spring容器对象
ApplicationContext 接口,通过他的getBean方法来获取对象
** 它的实现类 ClassPathXmlApplicationContext 从类的根路径下加载配置文件(写配置文件名即可)
FileSystemXmlApplicationContext 从磁盘任意加载配置文件(后面需要些配置文件全路径)
2.第二步为通过spring容器对象来获取bean对象
getBean() 参数可以写bean标签的id或者需要创建对象的类型的Class对象
如果同一个类配置了多个对象,只能使用第一种