2021-03-01

Ioc

概述:

Ioc:控制反转,就是将对象的管理托管给spring,包括对象的创建,依赖注入。目的就是解耦,降低程序的耦合度,便于维护。
Ioc采用Xml/Annotation + 工厂模式 +反射

1. 基于xml的Ioc

  • bean的创建:

     在xml文件中使用<bean id=""  class=""/>标签配置类
     id是创建对象的标识,class是类的全路径
    
  • bean的依赖注入:set注入和有参构造注入

     * set注入:
    
    		<bean id="" class="" >
        		<property name="" value=""/>//name 类中属性名,value需要注入的属性值,引用类型可以使用ref属性
    	 </bean>
    	
    
		* 有参构造注入:
		
			<bean id="" class="" >
	 			<constructor-arg name="" value=""/>
	 			//使用属性名赋值
	 			<constructor-arg index="" value=""/>
	 			//使用下标赋值
	  		</bean>
  	```

多种类型数据注入:
List,Map,Array,Set

	List
	<property name="">
        <list>
            <value><alue>
            <value><alue>
            <value><alue>
        <st>
    </property>

Map
<property name="map">
        <map>
            <entry key="" value=""/>
             <entry key="" value=""/>
            <entry key="" value=""/>
        </map>
    </property>

Set
<property name="set">
            <set>
                <value><alue>
                <value><alue>
                <value><alue>
            <t>
    </property>


	共同数据抽取:在bean标签内使用依赖注入对如重复的数据需要写多次,而对于固定的重复数据可以单独抽取出来
	1.添加命名空间
	

		

```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:context="http://www.springframework.org/schema/context"
		       xmlns:util="http://www.springframework.org/schema/util"
		       xsi:schemaLocation="http://www.springframework.org/schema/beans
		        https://www.springframework.org/schema/beans/spring-beans.xsd 
		        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
		        http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">

自动装配,就是对于复杂数据,对象引用,抽取的list,set等,可以按类型或名字查找,然后自动注入


<bean id="abc" class="com.pojo.ABC" autowire="byType"/>
//会在上下文中寻找和该bean的属性类型相同的数据自动注入,当然类型要唯一,否则会报错
<bean id="abc" class="com.pojo.ABC" autowire="byName"/>
//在上下文中寻找和属性名相同的数据自动注入
	2.使用标签抽取公共数据
	<util:list id=""><!--map,list,set-->
        <value><alue>
        <value><alue>
        <value><alue>
    </util:list>

bean的生命周期

1.创建—>2.依赖注入—>3.初始化—>4.获取对象—>5.销毁

  1. 把bean交给容器,spring创建对象
<bean id="" class="" init-method="initMethid" destroy-method="destory"/>


   
ApplicationContext context;
        context = new ClassPathXmlApplicationContext("***.xml");
  1. 值注入
<bean id="" class="">
        <property name="" value=""/>
</bean>
  1. 初始化
//bean标签中有属性init-method
<bean id="" class="" init-method="intMethod">
        //值注入后会调用此类中的初始化方法initMethod()
    </bean>

  1. 从容器中获取对象
Object o = context.getBean("***",Object.class);
  1. 销毁
<bean id="" class="" destroy-method="destory"/>

销毁需要手动调用方法

(ClassPathXmlApplicationContext)context.close();
才会执行bean标签的destroy方法

注:在初始化时还有后置处理器,需要实现接口BeanPostProcessor,
重写其中的方法

注:在 使用xml时,配置的后置处理器会对这个xml文件中的所有配置的bean起作用


//在值注入后spring会把对象传给PostProcessor,处理传入的对象后执行postProcessBeforeInitialization方法,结束需要返回该bean,进行初始化,初始化后执行postProcessAfterInitialization方法,然后返回bean,经过此过程才是第四步获取bean
public class PostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后置处理器before");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后置处理器after");
        return bean;
    }
}

导入属性文件

db.driver=com.mysql.jdbbc.Driver
db.url=jdbc:mysql//localhost:3306/db1
db.username=root
db.password=root
配置数据的复用
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

//先加入命名空间context
//使用标签
<context:property-placeholder location="classpath:dataSource/dataSource.properties"/>
//数据模板语法就是${},就可以取出数据
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${db.url}"/>
        <property name="driver" value="${db.driver}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Java中的日期时间类来实现租金计划的生成。具体实现步骤如下: 1. 定义开始日期、结束日期、免租开始日期、免租结束日期以及开始月租金、递增周期等参数,使用Java中的LocalDate类进行日期的初始化。 2. 根据递增周期计算出一年内的月份数,并定义一个数组用来存储每个月的租金。 3. 对于每个月,判断是否在免租期内,如果是则该月租金为0,否则按照递增率计算出该月的租金。 4. 将每个月的租金存储到数组中,并输出计算过程。 下面是示例代码实现: ``` import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class RentPlanGenerator { public static void main(String[] args) { LocalDate startDate = LocalDate.of(2021, 3, 1); // 租赁开始时间 LocalDate endDate = LocalDate.of(2022, 3, 1); // 租赁结束时间 LocalDate freeStartDate = LocalDate.of(2021, 3, 1); // 免租开始时间 LocalDate freeEndDate = LocalDate.of(2021, 3, 31); // 免租结束时间 double startRent = 600; // 开始月租金 double incrementRate = 0.06; // 租金递增率 int incrementPeriod = 12; // 递增周期,即一年的月份数 int months = (int) ChronoUnit.MONTHS.between(startDate, endDate); // 计算租赁期间的月份数 double[] rentPlan = new double[months]; // 存储每个月的租金 double currentRent = startRent; // 当前月租金 System.out.println("租赁开始时间:" + startDate); System.out.println("租赁结束时间:" + endDate); System.out.println("免租开始时间:" + freeStartDate); System.out.println("免租结束时间:" + freeEndDate); System.out.println("开始月租金:" + startRent); System.out.println("递增周期:" + incrementPeriod + "个月"); System.out.println(); System.out.println("计算过程:"); for (int i = 0; i < months; i++) { LocalDate currentDate = startDate.plusMonths(i); // 当前月份 if (currentDate.isAfter(freeStartDate) && currentDate.isBefore(freeEndDate.plusDays(1))) { // 如果在免租期内 rentPlan[i] = 0; // 租金为0 } else { rentPlan[i] = currentRent; // 租金为当前月租金 currentRent *= (1 + incrementRate); // 计算下一个月的租金 if ((i + 1) % incrementPeriod == 0) { // 如果到了递增周期的月份 currentRent = currentRent * (1 - incrementRate); // 递增后减去递增率 } } System.out.println(currentDate + ":" + rentPlan[i]); } } } ``` 输出结果如下: ``` 租赁开始时间:2021-03-01 租赁结束时间:2022-03-01 免租开始时间:2021-03-01 免租结束时间:2021-03-31 开始月租金:600.0 递增周期:12个月 计算过程: 2021-03-01:0.0 2021-04-01:636.0 2021-05-01:675.84 2021-06-01:717.72 2021-07-01:761.83 2021-08-01:808.32 2021-09-01:857.34 2021-10-01:909.09 2021-11-01:963.74 2021-12-01:1021.51 2022-01-01:1082.63 2022-02-01:1147.34 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值