spring框架技术学习

spring入门

 <!--老韩解读1. 配置monster对象/javabean2. 在beans中可以配置多个bean3. bean表示就是一个java对象4. class属性是用于指定类的全路径->spring底层使用反射创建5. id属性表示该java对象在spring容器中的id, 通过id可以获取到对象6. <property name="monsterId" value="100"> 用于给该对象的属性赋值--><bean class="com.hspedu.spring.bean.Monster" id="monster01"><property name="monsterId" value="100"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/></bean><bean class="com.hspedu.spring.bean.Monster" id="monster02"><property name="monsterId" value="1001"/><property name="name" value="牛魔王~"/><property name="skill" value="芭蕉扇~"/></bean>
package com.hspedu.spring.bean;/*** @author 韩顺平* @version 1.0* JavaBean / Entity*/
public class Monster {private Integer monsterId;private String name;private String skill;//全参构造器public Monster(Integer monsterId, String name, String skill) {this.monsterId = monsterId;this.name = name;this.skill = skill;}//无参构造器一定要写,Spring反射创建对象时,需要使用public Monster() {}public Integer getMonsterId() {return monsterId;}public void setMonsterId(Integer monsterId) {this.monsterId = monsterId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}@Overridepublic String toString() {return "Monster{" +"monsterId=" + monsterId +", name='" + name + '\'' +", skill='" + skill + '\'' +'}';}}
 @Testpublic void getMonster() {//老师解读//1. 创建容器 ApplicationContext//2. 该容器和容器配置文件关联ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");//3. 通过getBean获取对应的对象//   默认返回的是Object , 但是运行类型Monster//Object monster01 = ioc.getBean("monster01");Monster monster01 = (Monster) ioc.getBean("monster01");//4. 输出System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());System.out.println("monster01=" + monster01 + "属性name=" + monster01.getName() +" monserid=" + monster01.getMonsterId());//5. 也可以再获取的时候,直接指定Class类型, 可以在次获取Monster monster011 = ioc.getBean("monster01", Monster.class);System.out.println("monster011=" + monster011);System.out.println("monster011.name=" + monster011.getName());//6. 查看容器注入了哪些bean对象,会输出bean的idSystem.out.println("================================");String[] beanDefinitionNames = ioc.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName=" + beanDefinitionName);}System.out.println("================================");System.out.println("ok~~~");}
 @Testpublic void getMonster() {//老师解读//1. 创建容器 ApplicationContext//2. 该容器和容器配置文件关联ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");//3. 通过getBean获取对应的对象//   默认返回的是Object , 但是运行类型Monster//Object monster01 = ioc.getBean("monster01");Monster monster01 = (Monster) ioc.getBean("monster01");//4. 输出System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());System.out.println("monster01=" + monster01 + "属性name=" + monster01.getName() +" monserid=" + monster01.getMonsterId());//5. 也可以再获取的时候,直接指定Class类型, 可以在次获取Monster monster011 = ioc.getBean("monster01", Monster.class);System.out.println("monster011=" + monster011);System.out.println("monster011.name=" + monster011.getName());//6. 查看容器注入了哪些bean对象,会输出bean的idSystem.out.println("================================");String[] beanDefinitionNames = ioc.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName=" + beanDefinitionName);}System.out.println("================================");System.out.println("ok~~~");}

配置bean对象

 <!--配置Monster,通过类型来获取--><bean class="com.hspedu.spring.bean.Monster"><!--老韩解读1.当我们给某个bean对象设置属性的时候2.底层是使用对应的setter方法完成的, 比如setName()3.如果没有这个方法,就会报错--><property name="monsterId" value="100"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/></bean><!--<bean class="com.hspedu.spring.bean.Monster">--><!--    <property name="monsterId" value="200"/>--><!--    <property name="name" value="牛魔王~"/>--><!--    <property name="skill" value="芭蕉扇~"/>--><!--</bean>-->
 @Testpublic void getBeanByType() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");//老师解读,直接传入class对象/类型Monster bean = ioc.getBean(Monster.class);System.out.println("bean=" + bean);}

指定构造器配置

 <!--配置Monster对象,并且指定构造器老师解读1. constructor-arg标签可以指定使用构造器的参数2. index表示构造器的第几个参数 从0开始计算的3. 除了可以通过index 还可以通过 name / type 来指定参数方式4. 解除大家的疑惑, 类的构造器,不能有完全相同类型和顺序的构造器,所以可以通过type来指定--><bean id="monster03" class="com.hspedu.spring.bean.Monster"><constructor-arg value="200" index="0"/><constructor-arg value="白骨精" index="1"/><constructor-arg value="吸人血" index="2"/></bean><bean id="monster04" class="com.hspedu.spring.bean.Monster"><constructor-arg value="200" name="monsterId"/><constructor-arg value="白骨精" name="name"/><constructor-arg value="吸人血" name="skill"/></bean><bean id="monster05" class="com.hspedu.spring.bean.Monster"><constructor-arg value="300" type="java.lang.Integer"/><constructor-arg value="白骨精~" type="java.lang.String"/><constructor-arg value="吸人血~" type="java.lang.String"/></bean>
 @Testpublic void setBeanByConstructor() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");Monster monster03 = ioc.getBean("monster03", Monster.class);System.out.println("monster03=" + monster03);}

通过p来配置对象

<!--通过p名称空间来配置bean老韩解读1. 将光标放在p , 输入alt+enter , 就会自动的添加xmlns2. 有时需要多来几次--><bean id="monster06" class="com.hspedu.spring.bean.Monster"p:monsterId="500"p:name="红孩儿"p:skill="吐火"/>

给数组对象赋值配置

package com.hspedu.spring.bean;import java.util.*;/*** @author 韩顺平* @version 1.0* Master类*/
public class Master {private String name;//主人名private List<Monster> monsterList;private Map<String, Monster> monsterMap;private Set<Monster> monsterSet;//数组private String[] monsterName;//Java基础//这个Properties 是 Hashtable的子类 , 是key-value的形式//这里Properties  key和value 都是Stringprivate Properties pros;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Monster> getMonsterList() {return monsterList;}public void setMonsterList(List<Monster> monsterList) {this.monsterList = monsterList;}public Map<String, Monster> getMonsterMap() {return monsterMap;}public void setMonsterMap(Map<String, Monster> monsterMap) {this.monsterMap = monsterMap;}public Set<Monster> getMonsterSet() {return monsterSet;}public void setMonsterSet(Set<Monster> monsterSet) {this.monsterSet = monsterSet;}public String[] getMonsterName() {return monsterName;}public void setMonsterName(String[] monsterName) {this.monsterName = monsterName;}public Properties getPros() {return pros;}public void setPros(Properties pros) {this.pros = pros;}@Overridepublic String toString() {return "Master{" +"name='" + name + '\'' +", monsterList=" + monsterList +", monsterMap=" + monsterMap +", monsterSet=" + monsterSet +", monsterName=" + Arrays.toString(monsterName) +", pros=" + pros +'}';}
}
</bean><bean class="com.hspedu.spring.bean.Master" id="master"><property name="name" value="太上老君"/><property name="monsterList"><list><ref bean="monster01"/><ref bean="monster02"/><bean class="com.hspedu.spring.bean.Monster"><property name="name" value="老鼠精"/><property name="monsterId" value="100"/><property name="skill" value="吃粮食"/></bean></list></property><property name="monsterMap"><map><entry><key><value>monster</value></key><ref bean="monster03"/></entry><entry><key><value>monster4</value></key><ref bean="monster04"/></entry></map></property><property name="monsterSet"><set><ref bean="monster05"/><ref bean="monster06"/><bean class="com.hspedu.spring.bean.Monster"><property name="name" value="金角大王"/><property name="skill" value="吐水"/><property name="monsterId" value="666"/></bean></set></property><property name="monsterName"><array><value>小妖怪</value><value>小妖怪</value><value>小妖怪</value></array></property><property name="pros"><props><prop key="username">root</prop><prop key="password">123456</prop><prop key="id">127.0.1</prop></props></property>
 @Testpublic void setBeanByRef() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");MemberServiceImpl memberService =ioc.getBean("memberService", MemberServiceImpl.class);memberService.add();}
master=Master{name='太上老君', monsterList=[Monster{monsterId=100, name='牛魔王', skill='芭蕉扇'}, Monster{monsterId=1001, name='牛魔王~', skill='芭蕉扇~'}, Monster{monsterId=100, name='老鼠精', skill='吃粮食'}], monsterMap={monster=Monster{monsterId=200, name='白骨精', skill='吸人血'}, monster4=Monster{monsterId=200, name='白骨精', skill='吸人血'}}, monsterSet=[Monster{monsterId=300, name='白骨精~', skill='吸人血~'}, Monster{monsterId=500, name='红孩儿', skill='吐火'}, Monster{monsterId=666, name='金角大王', skill='吐水'}], monsterName=[小妖怪, 小妖怪, 小妖怪], pros={password=123456, username=root, id=127.0.1}}Process finished with exit code 0

通过ref配置对象

<bean class="com.hspedu.spring.dao.MemberDAOImpl" id="memberDAO"/><bean class="com.hspedu.spring.service.MemberServiceImpl" id="memberService"><property name="memberDAO" ref="memberDAO"/></bean>
package com.hspedu.spring.dao;/*** @author 韩顺平* @version 1.0* DAO对象*/
public class MemberDAOImpl {//构造器...public MemberDAOImpl() {//System.out.println("MemberDAOImpl 构造器被执行...");}//方法public void add() {System.out.println("MemberDAOImpl add()方法被执行");}
}
package com.hspedu.spring.service;import com.hspedu.spring.dao.MemberDAOImpl;/*** @author 韩顺平* @version 1.0* Service类*/
public class MemberServiceImpl {private MemberDAOImpl memberDAO;public MemberServiceImpl() {//System.out.println("MemberServiceImpl() 构造器被执行");}public MemberDAOImpl getMemberDAO() {return memberDAO;}public void setMemberDAO(MemberDAOImpl memberDAO) {//System.out.println("setMemberDAO()...");this.memberDAO = memberDAO;}public void add() {System.out.println("MemberServiceImpl add() 被调用..");memberDAO.add();}
}

通过内部类配置

 </bean><bean class="com.hspedu.spring.service.MemberServiceImpl" id="memberService2"><property name="memberDAO"><bean class="com.hspedu.spring.dao.MemberDAOImpl"/></property></bean>

读取数组

package com.hspedu.spring.bean;import java.util.List;/*** @author 韩顺平* @version 1.0* 书店类*/
public class BookStore {//书private List<String> bookList;//无参构造器,如果你没有其它的构造器,该无参构造器可以不写//但是如果你有其它的构造器,则必须显式的定义一下无参构造器public BookStore() {}public List<String> getBookList() {return bookList;}public void setBookList(List<String> bookList) {this.bookList = bookList;}@Overridepublic String toString() {return "BookStore{" +"bookList=" + bookList +'}';}
}
  <util:list id="mybooklist"><value>三国演义</value><value>红楼梦</value><value>西游记</value><value>水浒传</value></util:list><bean class="com.hspedu.spring.bean.BookStore" id="bookStore"><property name="bookList" ref="mybooklist"/>

级联赋值

 @Testpublic void setBeanByRelation() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");Emp emp = ioc.getBean("emp", Emp.class);System.out.println("emp=" + emp);}
 </bean><bean class="com.hspedu.spring.bean.Dept" id="dept"/><bean class="com.hspedu.spring.bean.Emp" id="emp"><property name="name" value="jack"/><property name="dept" ref="dept"/><property name="dept.name" value="java"/></bean>
package com.hspedu.spring.bean;/*** @author 韩顺平* @version 1.0* 部门类*/
public class Dept {private String name;public Dept() {}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Dept{" +"name='" + name + '\'' +'}';}
}
package com.hspedu.spring.bean;/*** @author 韩顺平* @version 1.0* 员工类*/
public class Emp {private String name;private Dept dept;public Emp() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Dept getDept() {return dept;}public void setDept(Dept dept) {this.dept = dept;}@Overridepublic String toString() {return "Emp{" +"name='" + name + '\'' +", dept=" + dept +'}';}
}

通过工厂获得类

  //通过静态工厂获取bean
//    //Java基础-静态和非静态@Testpublic void getBeanByStaticFactory() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");Monster my_monster01 = ioc.getBean("my_monster01", Monster.class);Monster my_monster04 = ioc.getBean("my_monster04", Monster.class);System.out.println("my_monster01=" + my_monster01);System.out.println(my_monster01 == my_monster04);//true}
<bean id="my_monster05" class="com.hspedu.spring.factory.MyFactoryBean"><property name="key" value="monster04"/></bean><bean class="com.hspedu.spring.factory.MyInstanceFactory" id="myInstanceFactory"/><bean class="com.hspedu.spring.factory.MyInstanceFactory" id="myInstanceFactory2"/><bean id="my_monster02" factory-bean="myInstanceFactory" factory-method="getMonster"><constructor-arg value="monster03"/></bean><bean id="my_monster03" factory-bean="myInstanceFactory2" factory-method="getMonster"><constructor-arg value="monster03"/></bean><bean id="my_monster04"class="com.hspedu.spring.factory.MyStaticFactory"factory-method="getMonster"><constructor-arg value="monster02"/></bean><bean id="my_monster01" class="com.hspedu.spring.factory.MyStaticFactory"factory-method="getMonster"><constructor-arg value="monster02"/>
package com.hspedu.spring.factory;import com.hspedu.spring.bean.Monster;
import org.springframework.beans.factory.FactoryBean;import java.util.HashMap;
import java.util.Map;/*** @author 韩顺平* @version 1.0* 是一个FactoryBean*/
public class MyFactoryBean implements FactoryBean<Monster> {//这个就是你配置时候,指定要获取的对象对应keyprivate String key;private Map<String, Monster> monster_map;{   //代码块,完成初始化monster_map = new HashMap<>();monster_map.put("monster03", new Monster(300, "牛魔王~", "芭蕉扇~"));monster_map.put("monster04", new Monster(400, "狐狸精~", "美人计~"));}public void setKey(String key) {this.key = key;}@Overridepublic Monster getObject() throws Exception {return monster_map.get(key);}@Overridepublic Class<?> getObjectType() {return Monster.class;}@Overridepublic boolean isSingleton() {//这里指定是否返是单例return false;}
}
package com.hspedu.spring.factory;import com.hspedu.spring.bean.Monster;import java.util.HashMap;
import java.util.Map;/*** @author 韩顺平* @version 1.0* 实例工厂类*/
public class MyInstanceFactory {private Map<String, Monster> monster_map;//通过普通代码块进行初始化{monster_map = new HashMap<>();monster_map.put("monster03", new Monster(300, "牛魔王~", "芭蕉扇~"));monster_map.put("monster04", new Monster(400, "狐狸精~", "美人计~"));}//写一个方法返回Monster对象public Monster getMonster(String key) {return monster_map.get(key);}
}
package com.hspedu.spring.factory;import com.hspedu.spring.bean.Monster;import java.util.HashMap;
import java.util.Map;/*** @author 韩顺平* @version 1.0* 静态工厂类-可以返回Monster对象*/
public class MyStaticFactory {private static Map<String, Monster> monsterMap;//使用 static代码块 进行初始化//在java基础的时候,讲过的static  {monsterMap = new HashMap<>();monsterMap.put("monster01", new Monster(100,"牛魔王","芭蕉扇"));monsterMap.put("monster02", new Monster(200,"狐狸精","美人计"));}//提供一个方法,返回Monster对象public static Monster getMonster(String key) {return monsterMap.get(key);}}

通过继承配置

@Testpublic void getBeanByExtends() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");Monster monster11 = ioc.getBean("monster11", Monster.class);System.out.println("monster11=" + monster11);Monster monster13 = ioc.getBean("monster13", Monster.class);System.out.println("monster13=" + monster13);}
 <bean id="monster10" class="com.hspedu.spring.bean.Monster"><property name="monsterId" value="10"/><property name="name" value="蜈蚣精"/><property name="skill" value="蜇人"/></bean><bean id="monster11"class="com.hspedu.spring.bean.Monster"parent="monster10"/>
 <bean id="monster12" class="com.hspedu.spring.bean.Monster" abstract="true"><property name="monsterId" value="100"/><property name="name" value="蜈蚣精~"/><property name="skill" value="蜇人~"/></bean><bean id="monster13" class="com.hspedu.spring.bean.Monster" parent="monster12"/>

验证执行顺序

  @Testpublic void testBeanByCreate() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");System.out.println("ok");}
<bean id="student01" class="com.hspedu.spring.bean.Student" depends-on="department01"/><bean id="department01" class="com.hspedu.spring.bean.Department"/>

测试scope

 @Testpublic void testBeanScope() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");Cat cat = ioc.getBean("cat", Cat.class);Cat cat2 = ioc.getBean("cat", Cat.class);Cat cat3 = ioc.getBean("cat", Cat.class);System.out.println("cat=" + cat);System.out.println("cat2=" + cat2);System.out.println("cat3=" + cat3);}
package com.hspedu.spring.bean;/*** @author 韩顺平* @version 1.0*/
public class Cat {private Integer id;private String name;public Cat() {//System.out.println("Cat() 被执行...");}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}//@Override//public String toString() {//    return "Cat{" +//            "id=" + id +//            ", name='" + name + '\'' +//            '}';//}
}
 <bean id="cat" class="com.hspedu.spring.bean.Cat" scope="prototype" lazy-init="false"><property name="id" value="100"/><property name="name" value="小花猫"/></bean>

测试容器生命周期

  @Testpublic void testBeanLife() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");House house = ioc.getBean("house", House.class);System.out.println("使用house=" + house);//关闭容器//1. 这里又要考察大家的java基础//2. ioc的编译类型 ApplicationContext , 运行类型 ClassPathXmlApplicationContext//3. 因为ClassPathXmlApplicationContext 实现了 ConfigurableApplicationContext//4. ClassPathXmlApplicationContext 是有close//5. 将ioc 转成ClassPathXmlApplicationContext,再调用close//ioc.close();//关闭ioc容器.((ConfigurableApplicationContext) ioc).close();}
<bean class="com.hspedu.spring.bean.Monster" id="monster1000"><property name="monsterId" value="${monsterId}"/><property name="skill" value="${skill}"/><property name="name" value="${name}"/></bean><bean class="com.hspedu.spring.bean.House" id="house"init-method="init"destroy-method="destroy"><property name="name" value="北京豪宅"/></bean>

后置处理器

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--配置House对象--><bean class="com.hspedu.spring.bean.House" id="house"init-method="init"destroy-method="destroy"><property name="name" value="大豪宅"/></bean><bean class="com.hspedu.spring.bean.House" id="house02"init-method="init"destroy-method="destroy"><property name="name" value="香港豪宅"/></bean><!--配置了一个Monster对象--><!--配置后置处理器对象老师解读1. 当我们在beans02.xml 容器配置文件 配置了 MyBeanPostProcessor2. 这时后置处理器对象,就会作用在该容器创建的Bean对象3. 已经是针对所有对象编程->切面编程AOP--><bean class="com.hspedu.spring.bean.MyBeanPostProcessor" id="myBeanPostProcessor"/></beans>
package com.hspedu.spring.bean;/*** @author 韩顺平* @version 1.0*/
public class House {private String name;public House() {System.out.println("House() 构造器...");}public String getName() {return name;}public void setName(String name) {System.out.println("House setName()=" + name);this.name = name;}//老师解读//1. 这个方法是程序员来编写的.//2. 根据自己的业务逻辑来写.public void init() {System.out.println("House init()..");}//老师解读//1. 这个方法是程序员来编写的.//2. 根据自己的业务逻辑来写.//3. 名字也不是固定的public void destroy() {System.out.println("House destroy()..");}@Overridepublic String toString() {return "House{" +"name='" + name + '\'' +'}';}
}
@Testpublic void testBeanPostProcessor() {ApplicationContext ioc =new ClassPathXmlApplicationContext("beans02.xml");House house = ioc.getBean("house", House.class);System.out.println("使用house=" + house);House house02 = ioc.getBean("house02", House.class);System.out.println("使用house02=" + house02);((ConfigurableApplicationContext)ioc).close();}
House() 构造器...
House setName()=大豪宅
postProcessBeforeInitialization().. bean=House{name='大豪宅'} beanName=house
House setName()=上海豪宅~
House init()..
postProcessAfterInitialization().. bean=House{name='上海豪宅~'} beanName=house
House() 构造器...
House setName()=香港豪宅
postProcessBeforeInitialization().. bean=House{name='香港豪宅'} beanName=house02
House setName()=上海豪宅~
House init()..
postProcessAfterInitialization().. bean=House{name='上海豪宅~'} beanName=house02
使用house=House{name='上海豪宅~'}
使用house02=House{name='上海豪宅~'}
House destroy()..
House destroy()..

自动装配

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--配置OrderDao对象--><bean class="com.hspedu.spring.dao.OrderDao" id="orderDao"/><!--配置OrderService对象老师解读1. autowire="byType" 表示 在创建 orderService时通过类型的方式 给对象属性 自动完成赋值/引用2. 比如OrderService 对象有 private OrderDao orderDao3. 就会在容器中去找有没有 OrderDao类型对象4. 如果有,就会自动的装配, 老师提示如果是按照 byType 方式来装配, 这个容器中,不能有两个的OrderDao类型对象5. 如果你的对象没有属性,  autowire就没有必要写6. 其它类推..7. 如果我们设置的是 autowire="byName" 表示通过名字完成自动装配8. 比如下面的 autowire="byName" class="com.hspedu.spring.service.OrderService"1) 先看 OrderService 属性 private OrderDao orderDao2) 再根据这个属性的setXxx()方法的 xxx 来找对象id3) public void setOrderDao() 就会找id=orderDao对象来进行自动装配4) 如果没有就装配失败--><bean autowire="byName" class="com.hspedu.spring.service.OrderService"id="orderService"/><!--配置OrderAction--><bean autowire="byName" class="com.hspedu.spring.web.OrderAction" id="orderAction"/><!--指定属性文件老师说明1. 先把这个文件修改成提示All Problem2. 提示错误,将光标放在context 输入alt+enter 就会自动引入namespace3. location="classpath:my.properties" 表示指定属性文件的位置4. 提示,需要带上 classpath5. 属性文件有中文,需要将其转为unicode编码-> 使用工具--><context:property-placeholder location="classpath:my.properties"/><!--配置Monster对象1.通过属性文件给monster对象的属性赋值2. 这时我们的属性值通过${属性名}3. 这里说的 属性名 就是 my.properties文件中的 k=v 的k--><bean class="com.hspedu.spring.bean.Monster" id="monster1000"><property name="monsterId" value="${monsterId}"/><property name="skill" value="${skill}"/><property name="name" value="${name}"/></bean></beans>
package com.hspedu.spring.dao;/*** @author 韩顺平* @version 1.0* DAO类*/
public class OrderDao {//方法。。。public void saveOrder() {System.out.println("保存 一个订单...");}
}
package com.hspedu.spring.service;import com.hspedu.spring.dao.OrderDao;/*** @author 韩顺平* @version 1.0* Service类*/
public class OrderService {//OrderDao属性private OrderDao orderDao;//getterpublic OrderDao getOrderDao() {return orderDao;}//setterpublic void setOrderDao(OrderDao orderDao) {this.orderDao = orderDao;}
}

扫描

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--配置容器要扫描的包老师解读1. component-scan 要对指定包下的类进行扫描, 并创建对象到容器2. base-package 指定要扫描的包3. 含义是当spring容器创建/初始化时,就会扫描com.hspedu.spring.component包下的所有的 有注解 @Controller / @Service / @Respository / @Component类将其实例化,生成对象,放入到ioc容器4. resource-pattern="User*.class" 表示只扫描com.hspedu.spring.component 和它的子包下的User打头的类-->
<!--    <context:component-scan base-package="com.hspedu.spring.component"/>--><!--需求:如果我们希望排除某个包/子包下的某种类型的注解,可以通过exclude-filter来指定1. context:exclude-filter 指定要排除哪些类2. type 指定排除方式 annotation表示按照注解来排除3. expression="org.springframework.stereotype.Service" 指定要排除的注解的全路径--><!--<context:component-scan base-package="com.hspedu.spring.component">--><!--    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>--><!--    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>--><!--</context:component-scan>--><!--需求:如果我们希望按照自己的规则,来扫描包/子包下的某些注解, 可以通过 include-filter1. use-default-filters="false" 表示不使用默认的过滤机制/扫描机制2. context:include-filter 表示要去扫描哪些类3. type="annotation" 按照注解方式来扫描/过滤4. expression="org.springframework.stereotype.Service" 指定要扫描的注解的全路径--><context:component-scan base-package="com.hspedu.spring.component" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/><context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/></context:component-scan>
</beans>

运用el表达式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"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"><!--配置一个monster对象--><bean id="monster01" class="com.hspedu.spring.bean.Monster"><property name="monsterId" value="100"/><property name="name" value="蜈蚣精~"/><property name="skill" value="蜇人~"/></bean><!-- spring el 表达式使用老师解读1. 通过spel给bean的属性赋值--><bean id="spELBean" class="com.hspedu.spring.bean.SpELBean"><!-- sp el 给字面量 --><property name="name" value="#{'韩顺平教育'}"/><!-- sp el 引用其它bean --><property name="monster" value="#{monster01}"/><!-- sp el 引用其它bean的属性值 --><property name="monsterName" value="#{monster01.name}"/><!-- sp el 调用普通方法(返回值)  赋值 --><property name="crySound" value="#{spELBean.cry('喵喵的..')}"/><!-- sp el 调用静态方法(返回值) 赋值 --><property name="bookName" value="#{T(com.hspedu.spring.bean.SpELBean).read('天龙八部')}"/><!-- sp el 通过运算赋值 --><property name="result" value="#{89*1.2}"/></bean>
</beans>
package com.hspedu.spring.bean;/*** @author 韩顺平* @version 1.0*/
public class SpELBean {private String name;private Monster monster;private String monsterName;private String crySound; //叫声private String bookName;private Double result;public SpELBean() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Monster getMonster() {return monster;}public void setMonster(Monster monster) {this.monster = monster;}public String getMonsterName() {return monsterName;}public void setMonsterName(String monsterName) {this.monsterName = monsterName;}public String getCrySound() {return crySound;}public void setCrySound(String crySound) {this.crySound = crySound;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public Double getResult() {return result;}public void setResult(Double result) {this.result = result;}//cry 方法会返回字符串public String cry(String sound) {return "发出 " + sound + "叫声...";}//read 返回字符串public static String read(String bookName) {return "正在看 " + bookName;}@Overridepublic String toString() {return "SpELBean{" +"name='" + name + '\'' +", monster=" + monster +", monsterName='" + monsterName + '\'' +", crySound='" + crySound + '\'' +", bookName='" + bookName + '\'' +", result=" + result +'}';}
}

注解配置

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scanbase-package="com.hspedu.spring.component"/><!--配置两个UserService对象--><bean class="com.hspedu.spring.component.UserService" id="userService200"/><bean class="com.hspedu.spring.component.UserService" id="userService300"/>
</beans>
package com.hspedu.spring.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;/*** @author 韩顺平* @version 1.0* @Controller 标识该类是一个控制器Controller, 通常这个类是一个Servlet*/
@Controller
public class UserAction {//xml配置 ref//老师说明 @Autowired//1)在IOC容器中查找待装配的组件的类型,如果有唯一的bean匹配(按照类型),则使用该bean装配//2)如待装配的类型对应的bean在IOC容器中有多个,则使用待装配的属性的属性名作为id值再进行查找,//  找到就装配,找不到就抛异常//@Autowired//老师说明 @Resource//1) @Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,//  而type属性则解析为bean的类型.所以如果使用name属性,则使用byName的自动注入策略,//  而使用type属性时则使用byType自动注入策略//  比如@Resource(name = "userService") 表示装配 id=userService对对象//  比如@Resource(type = UserService.class) 表示按照UserService.class类型进行装配, 这时要求容器中,只能有一个这样类型的对象//2) 如果@Resource 没有指定 name 和 type ,则先使用byName注入策略,//   如果匹配不上, 再使用byType策略, 如果都不成功,就会报错//=================================//老师说明: @Autowired + @Qualifier(value = "userService02") 组合也可以完成指定 name/id 来进行自动装配//指定id进行组装, 也可以使用@Autowired 和 @Qualifier(value = "userService02")// 这时,是装配的 id=userService02 , 需要两个注解都需要写上@Resource(name="userService")private UserService userService200;public void sayOk() {System.out.println("UserAction 的sayOk()");System.out.println("userAction 装配的 userService属性=" + userService200);userService200.hi();}
}
package com.hspedu.spring.component;import org.springframework.stereotype.Service;/*** @author 韩顺平* @version 1.0* @Service 标识该类是一个Service类/对象*/
@Service
public class UserService {//方法..public void hi(){System.out.println("UserService hi()~");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP聊天室

1.头文件 /* * 文件名称&#xff1a;UDP.h * 创 建 者&#xff1a;crx * 创建日期&#xff1a;2023年09月3日 * 描 述&#xff1a; */ #ifndef _UDP_H #define _UDP_H#include <stdio.h> #include <sys/types.h> /* See NOTES */ #includ…

使用Redis控制表单重复提交控制接口访问频率

场景一&#xff1a;控制表单重复提交 防重提交有很多方案&#xff0c;从前端的按钮置灰&#xff0c;到后端synchronize锁、Lock锁、借助Redis语法实现简单锁、RedisLua分布式锁、Redisson分布式锁&#xff0c;再到DB的悲观锁、乐观锁、借助表唯一索引等等都可以实现防重提交&am…

Unity 之 Material (材质)渲染3D对象的重要组件

文章目录 介绍一些代码例子 介绍 在Unity中&#xff0c;Material&#xff08;材质&#xff09;是一种用于渲染3D对象的重要组件。Material定义了对象的外观&#xff0c;包括其颜色、纹理、光照属性和反射等。以下是关于Material的详细介绍&#xff1a; 创建Material&#xff1…

云计算时代的采集利器

大家好&#xff01;在今天的知识分享中&#xff0c;我们将探讨一个在云计算环境中的爬虫应用利器——独享IP。如果你是一名爬虫程序员&#xff0c;或者对数据采集和网络爬虫有浓厚的兴趣&#xff0c;那么这篇文章将向你展示独享IP在云计算环境下的应用价值。 1. 什么是独享IP&…

资深测试面试-参考一下

资深测试面试 1、项目情况根据什么来跟进 2、团队的情况 3、发现问题怎么去处理 4、用例会去重点关注哪些 5、根据测试用例能发现什么问题吗 6、举例最近一个需求的核心要点&#xff0c;用例你是怎么做的 7、产品把需求给到你&#xff0c;你后续的工作有哪些&#xff0c;主要会…

冠达管理:元宇宙三年行动计划发布,高增长潜力股名单出炉

未来5年&#xff0c;国内元国际商场规划至少打破2000亿元大关。 金融监管总局9月10日发布《关于优化保险公司偿付能力监管规范的告诉》&#xff0c;优化保险公司偿付能力监管规范&#xff0c;自发布之日起施行。 金融监管总局释放重要利好&#xff0c;引导保险资金更大力度地…

ClickHouse 存算分离改造:小红书自研云原生数据仓库实践

ClickHouse 作为业界性能最强大的 OLAP 系统&#xff0c;在小红书内部被广泛应用于广告、社区、直播和电商等多个业务领域。然而&#xff0c;原生 ClickHouse 的 MPP 架构在运维成本、弹性扩展和故障恢复方面存在较大局限性。为应对挑战&#xff0c;小红书数据流团队基于开源 C…

四叶草clover配置工具:Clover Configurator for Mac

Clover Configurator是一款Mac上的工具&#xff0c;用于配置和优化Clover引导加载器。Clover引导加载器是一种用于启动macOS的开源引导加载器。它允许用户在启动时选择操作系统和配置启动选项。 Clover Configurator提供了一个可视化的界面&#xff0c;让用户可以轻松地编辑和…

thinkphp6(tp6)创建定时任务

使用 thinkphp6 框架中提供的命令行形式实现定时任务 一、创建一个自定义命令类文件 php think make:command Hello 会生成一个 app\command\Hello.php 命令行指令类&#xff0c;我们修改内容如下&#xff1a; <?php declare (strict_types1);namespace app\command;use …

PlantUML入门教程:画时序图

软件工程中会用到各种UML图&#xff0c;例如用例图、时序图等。那我们能不能像写代码一样去画图呢&#xff1f; 今天推荐一款软件工程师的作图利器--PlantUML&#xff0c;它能让你用写代码的方式快速画出UML图。 一、什么是PlantUML&#xff1f; PlantUML是一个允许你快速作出…

【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

Ubuntu搭建MQTT Broker及面板发布消息、订阅主题 配置curl数据源 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash开始安装 sudo apt-get install emqx启动 sudo emqx start使用面板 根据自己的服务器是否开始了防火墙放行端口&#xff08;1808…

2023工博会,正运动机器视觉运动控制一体机应用预览(二)

展会倒计时&#xff1a;7天 本次的中国国际工业博览会正运动技术将携高性能x86平台Windows实时视觉运动控制器VPLC711亮相。 •运动控制机器视觉一站式开发&#xff0c;缩短开发周期&#xff0c;降低硬件成本&#xff1b; •可替代传统的工控机运动控制卡/PLC视觉软件的自动化…

平衡二叉搜索树(AVL)——【C++实现插入、删除等操作】

本章完整代码gitee地址&#xff1a;平衡二叉搜索树 文章目录 &#x1f333;0. 前言&#x1f332;1. AVL树概念&#x1f334;2. 实现AVL树&#x1f33f;2.1 结构定义&#x1f33f;2.2 插入&#x1f490;左单旋&#x1f490;右单旋&#x1f490;左右双旋&#x1f490;右左双旋 &a…

TypeScript:赋予JavaScript数据类型新的力量,提升编程效率!

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ &#x1f4da; 前言 TypeScript&#xff1a;扩展JavaScript数据类型&#xff0c;赋予编程更强大的表达能力&#xff01…

数据挖掘实验-主成分分析与类特征化

数据集&代码https://www.aliyundrive.com/s/ibeJivEcqhm 一.主成分分析 1.实验目的 了解主成分分析的目的&#xff0c;内容以及流程。 掌握主成分分析&#xff0c;能够进行编程实现。 2.实验原理 主成分分析的目的 主成分分析就是把原有的多个指标转化成少数几个代表…

web3j solidity 转java

需要使用的环境 web3j&#xff0c;nodejs 安装编译sol工具 1 $ npm install -g solc 保存为hello.sol文件到本地 1 2 3 4 5 6 7 8 pragma solidity 0.4.19; contract hello { function main(uint a) constant returns (uint b) { uint result a * 8; …

Kafka3.0.0版本——消费者(Sticky分区分配策略以及再平衡)

目录 一、Sticky分区分配策略原理二、Sticky分区分配策略 示例需求三、Sticky分区分配策略代码案例3.1、创建带有7个分区的sevenTopic主题3.2、创建三个消费者 组成 消费者组3.3、创建生产者3.4、测试3.5、Sticky分区分配策略代码案例说明 四、Sticky分区分配再平衡案例4.1、停…

Redis 删除策略

文章目录 Redis 删除策略一、过期数据二、数据删除策略1、定时删除2、惰性删除3、定期删除4、删除策略对比 三、逐出算法 Redis 删除策略 一、过期数据 Redis是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态 XX &a…

【李自然说】在创业路演现场,3分钟打动投资人 (notebook)[Updating]

【李自然说】在创业路演现场&#xff0c;3分钟打动投资人_哔哩哔哩_bilibili 融资的核心问题&#xff08;三分钟内讲清楚&#xff09; - 竞争者做什么&#xff0c;我们做什么 &#xff08;是否有&#xff0c;没有那潜在competitor是谁&#xff0c;有没有可能变成合作伙伴&#…

构建高效实时数据流水线:Flink、Kafka 和 CnosDB 的完美组合

当今的数据技术生态系统中&#xff0c;实时数据处理已经成为许多企业不可或缺的一部分。为了满足这种需求&#xff0c;Apache Flink、Apache Kafka和CnosDB等开源工具的结合应运而生&#xff0c;使得实时数据流的收集、处理和存储变得更加高效和可靠。本篇文章将介绍如何使用 F…