欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring框架IOC

程序员文章站 2022-07-13 21:19:47
...

idea配置tomcat,jetty服务器插件

pom.xml 添加插件

<build> 
    <plugins>
        
        <plugin> 
            <groupId>org.apache.tomcat.maven</groupId> 
            <artifactId>tomcat7-maven-plugin</artifactId> 
            <version>2.2</version> 
        </plugin>
        
        <!--jetty --> 
        <plugin>
            <groupId>org.eclipse.jetty</groupId> 
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.4.20.v20190813</version> 
        </plugin>
        
    </plugins>
</build>

Spring框架环境搭建

pom.xml添加spring框架坐标依赖

	<!--
        添加Spring 坐标
    -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.9.RELEASE</version>
    </dependency>

Spring Ioc 实例化 bean 对象的三种方式

一.构造器实例化(默认)

构造器必须存在 不存在 出现异常
xml配置
<bean id="userServiceImpl" class="com.shsxt.service.impl.UserServiceImpl"></bean>

二.静态工厂(了解)

定义静态工厂
public class StaticFactory {
    public static UserDao getUserDao(){ 
        System.out.println("实例化静态工厂 返回userDao..."); 	
        return new UserDao(); 
    }
}
xml配置
<!-- 配置bean 使用bean 标签 --> 
<bean id="userDao" class="com.shsxt.factory.StaticFactory" factory-method="getUserDao"> </bean>
测试

对象仍然为单例对象

三.实例化工厂(了解)

工厂定义
public class InstanceFactory { 
    public AccountDao getAccountDao(){ 
        return new AccountDao(); 
    } 
}
xml配置
<!-- 
    实例化工厂 
    	首先配置实例化工厂bean 对象 
    	再配置业务bean 
    		factory-bean:实例化工厂
    		id factory-method:实例化工厂方法 
--> 
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory">
</bean> 
<bean id="accountDao" factory-bean="instanceFactory" factory-method="getAccountDao" ></bean>

Spring IOC 手动装配(注入)

set(方法) 推荐使用

内部实现通过反射

java代码

public class UserService { 
    private UserDao userDao ; 
    public AccountDao accountDao; 
    private String host;
    private Integer port; 
    public void setPort(Integer port) { 
        this.port = port; 
    }
    
    public void setHost(String host) { 
        this.host = host; 
    }
    
    public void setAccountDao(AccountDao accountDao) { 
        this.accountDao = accountDao; 
    }
    
    public void setUserDao(UserDao userDao) {
		this.userDao = userDao; 
    }
    
    public UserService() {
        
    }
    
    public void test(){ 
        userDao.test(); 
        accountDao.test(); 
        System.out.println("hello spring"); 
    } 
}

xml配置

<bean id="userService" class="com.shsxt.service.UserService"> 
    <!--
        Set 注入使用Property标签: 
       	  name:业务对象属性名 
       	  ref: 某一个bean 的id 值 
          value:给基本类型 常用对象(String 日期) || 集合 
	-->
    <property name="userDao" ref="userDao"></property> 
    <property name="accountDao" ref="accountDao"></property> 
    <property name="host" value="192.168.1.190"></property> 
    <property name="port" value="25"></property> 
    
</bean>

<bean id="userDao" class="com.shsxt.dao.UserDao"></bean> 
<bean id="accountDao" class="com.shsxt.dao.AccountDao"></bean>
Set 注入实现集合装配

java代码

private List<String> list; 
private Set<String> ss; 
private Map<String,Object> map; 
private Properties properties; 

public void setProperties(Properties properties) {
	this.properties = properties; 
}

public void setMap(Map<String, Object> map) { 
    this.map = map;
}

public void setSs(Set<String> ss) {
    this.ss = ss; 
}

public void setList(List<String> list) { 
    this.list = list;
} 

 public void printList(){
        list.forEach(s -> {
            System.out.println(s);
        });
  }

 public void printSet(){
        ss.forEach(s -> {
            System.out.println(s);
        });
    }

 public void printMap(){
        map.forEach((k,v)->{
            System.out.println(k+","+v);
        });
    }

 public void printProperties(){
        for (Map.Entry<Object, Object> objectEntry : properties.entrySet()) {
            System.out.println(objectEntry.getKey() + "," + objectEntry.getValue());
        }
    }

XML 配置

<bean id="userService" class="com.shsxt.service.UserService">
        <!--
            Set 注入使用Property标签:
                name:业务对象属性名
                ref: 某一个bean 的id 值
        -->
        <property name="userDao" ref="userDao"></property>

        <property name="accountDao" ref="accountDao" ></property>
        <property name="host" value="192.168.1.190"></property>

        <property name="port" value="25"></property>

        <!--
           list 集合装配
        -->
        <property name="list">
            <list>
                <value>上海松江</value>
                <value>上海浦东</value>
                <value>上海徐汇</value>
            </list>
        </property>

        <!--
          set 注入
        -->
        <property name="ss">
            <set>
                <value>杭州</value>
                <value>苏州</value>
                <value>八宝粥</value>
            </set>
        </property>


        <!--
           map 注入
        -->
        <property name="map">
            <map>
                <entry>
                    <key>
                        <value>上海</value>
                    </key>
                    <value>环球金融中心</value>
                </entry>
                <entry>
                    <key><value>杭州</value></key>
                    <value>西湖</value>
                </entry>
                <entry>
                    <key><value>苏州</value></key>
                    <value>园林</value>
                </entry>
            </map>
        </property>
        
        <property name="properties">
            <props>
                <prop key="a">10</prop>
                <prop key="b">abc</prop>
                <prop key="c">test</prop>
            </props>
        </property>

    </bean>

构造器

java代码

private AccountDao accountDao; 
private RoleService roleService; 
private String aname; 

public AccountService(AccountDao accountDao, RoleService roleService, String aname) { 
	this.accountDao = accountDao; 
	this.roleService = roleService;
	this.aname = aname;                                                                                                                                                                       		
}

xml代码

<bean id="accountService" class="com.shsxt.service.AccountService"> 
    <!--
		构造器注入 constructor-arg 
			name:业务对象属性名 
			ref: 某一个bean 的id 值 
			value:基本类型 常用类型String|日期 
	--> 
    <constructor-arg name="accountDao" ref="accountDao"></constructor-arg>
    <constructor-arg name="roleService" ref="roleService"></constructor-arg> 				<constructor-arg name="aname" value="admin" ></constructor-arg> 

</bean>
使用构造器注入有可能出现相互引用的问题

静态工厂(了解)

实例化工厂(了解)

Spring IOC自动化装配及自动扫描管理Bean(注入)

IOC 帮助应用程序实现属性的自动化注入 具体配置借助注解

环境调整:

XML 配置 引用命名空间 context

* 自动化装配注解(反射): 
* @Resource: 
* 	默认按照属性名称实现装配 如果属性名未找到按照类型(Class类型)装配 
* 	属性可以提供set 方法 也可以不提供set 方法 
* 	声明在属性级别 或者set方法级别 
* 	如果显式声明name 属性 ioc 实现装配时必须按照name 属性进行查找bean 对象 如果未找到报错 
* 	name 的使用在接口注入时 如果接口仅有一个实现 可以省略name 属性 如果接口存在多个实现 必须声明name值

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

    <!--
       配置扫描包范围   应用程序业务对象
    -->
    <context:component-scan base-package="com.shsxt"/>
</beans>

Bean的作用域及生命周期问题

<!--
       lazy-init:懒加载
           默认false  当ioc 启动时 内部对bean 对象进行实例化
           如果为true  当ioc 启动时 内部不会对bean 对象进行实例化  当获取bean 对象时才会进行实例化 对象仅被实例化一次  单例

         lazy-init 默认值为false:
              1.提前发现应用潜在的配置问题
              2.提供应用程序执行效率

         什么样的对象适合作为单例对象???
              无状态Bean 适合作为单例对象-不存在引起对象状态变化的成员变量
              有状态Bean 不适合作为单例对象-存在引起对象状态变化的成员变量

        作用域分类
             单例作用域(默认)
             原型域(scope="prototype"):每次获取 ioc 会重新实例化bean 对象  了解
             web 作用域
                request 作用域  每一次请求ioc 建立request 域的bean
                session 作用域  每一次有效会话
                GlobalSession(了解) 类似session

         Bean 生命周期
             定义
             初始化
                 init-method:方法名
                 实现接口InitializingBean
             使用阶段
             销毁

         IOC-控制反转与依赖注入:应用程序产生对象的过程转交给外部容器(IOC  充当工厂角色)来负责产生  属性赋值交给ioc 实现

-->

Spring IOC定时调度

配置quartz.xml

cron表达式可以利用网页在线cron表达式编辑
<?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:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task.xsd">

    <!--
       配置扫描包范围   应用程序业务对象
    -->
    <context:component-scan base-package="com.shsxt"/>


    <!--
       定时任务配置
           1.注解
           2.xml
    -->
   <!-- <task:annotation-driven/>  基于注解-->

    <task:scheduled-tasks>
        <task:scheduled ref="jobService" method="job01" cron="0/2 * * * * ?"/>
        <task:scheduled ref="jobService" method="job02" cron="0/5 * * * * ?"/>
    </task:scheduled-tasks>
	<!--基于xml-->
</beans>

java代码

@Service
public class JobService {

    //@Scheduled(cron = "0/2 * * * * ? ") 基于注解配置
    public void job01(){
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"-->job01-->hello world");
    }

   // @Scheduled(cron = "0/5 * * * * ? ") 基于注解配置
    public void job02(){
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"-->job02-->hello world");
    }

}

测试

public class Quartz {

    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("quartz.xml");
        //加载xml,ioc启动,自动扫描JobService,JobService被实例化,ioc根据注解@Scheduled定时调度job方法
    }
}