spring学习第一天--08-02


概念:将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对象
		如果同一个类配置了多个对象,只能使用第一种
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值