package com.dance.spring5;
public class Book {
//创建属性
private String bname;
private String bauthor;
//创建属性对应的 set 方法
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
@Override
public String toString() {
return "Book{" +
"bname='" + bname + '\'' +
", bauthor='" + bauthor + '\'' +
'}';
}
public static void main(String[] args) {
Book book = new Book();
book.setBname("flower");
System.out.println(book);
}
}
在Spring配置文件配置对象创建,配置属性注入
<!--
name : 属性名
value : 属性值
-->
<bean id="book" class="com.dance.spring5.Book">
<property name="bname" value="dance" />
</bean>
新建测试类
@Test
public void testBook(){
// 加载Spring配置文件
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 获取Bean
Book book = classPathXmlApplicationContext.getBean("book", Book.class);
// 调用方法
System.out.println(book);
}
执行结果
Book{bname='dance', bauthor='null'}
package com.dance.spring5;
public class Orders {
//属性
private String oname;
private String address;
//有参数构造
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
@Override
public String toString() {
return "Orders{" +
"oname='" + oname + '\'' +
", address='" + address + '\'' +
'}';
}
public static void main(String[] args) {
Orders orders = new Orders("flower", "北京");
System.out.println(orders);
}
}
在Spring配置文件中进行配置
<!-- 有参构造注入属性 -->
<bean id="orders" class="com.dance.spring5.Orders">
<constructor-arg name="oname" value="flower"/>
<constructor-arg name="address" value="北京"/>
</bean>
新检测试类
@Test
public void testOrders(){
// 加载Spring配置文件
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 获取Bean
Orders orders = classPathXmlApplicationContext.getBean("orders", Orders.class);
// 调用方法
System.out.println(orders);
}
执行结果
Orders{oname='flower', address='北京'}
在配置文件中加入P命名空间的校验
xmlns:p="http://www.springframework.org/schema/p"
配置Spring文件
<!-- 使用P命名空间注入-->
<bean id="ordersP" class="com.dance.spring5.Orders" p:oname="dance" p:address="河北" />
修改Orders类
注意:因为P命名空间注入依赖于Set方法所以增加setter and getter
package com.dance.spring5;
public class Orders {
//属性
private String oname;
private String address;
public String getOname() {
return oname;
}
public void setOname(String oname) {
this.oname = oname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Orders() {
}
//有参数构造
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
@Override
public String toString() {
return "Orders{" +
"oname='" + oname + '\'' +
", address='" + address + '\'' +
'}';
}
public static void main(String[] args) {
Orders orders = new Orders("flower", "北京");
System.out.println(orders);
}
}
新建测试类
@Test
public void testOrdersP(){
// 加载Spring配置文件
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 获取Bean
Orders orders = classPathXmlApplicationContext.getBean("ordersP", Orders.class);
// 调用方法
System.out.println(orders);
}
执行结果
Orders{oname='dance', address='河北'}
<bean id="orderType" class="com.dance.spring5.Orders">
<property name="address">
<null />
</property>
</bean>
属性值包含特殊符号
<bean id="orderType" class="com.dance.spring5.Orders">
<property name="address">
<null />
</property>
<property name="oname">
<!--CDATA-->
<value><![CDATA[ <<Spring5 API>> ]]></value>
</property>
</bean>
(1)创建两个类 service 类和 dao 类
(2)在 service 调用 dao 里面的方法
(3)在 spring 配置文件中进行配置
package com.dance.spring5.dao;
public class UserDao {
public void update(){
System.out.println("update to database .....");
}
}
package com.dance.spring5.service;
import com.dance.spring5.dao.UserDao;
public class UserService {
public UserDao userDao;
public void add(){
System.out.println("add......");
userDao.update();
}
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
<!-- 创建UserDao -->
<bean id="userDao" class="com.dance.spring5.dao.UserDao" />
<!-- 创建UserService -->
<bean id="userService" class="com.dance.spring5.service.UserService">
<!-- 采用ref引用已有的Bean -->
<property name="userDao" ref="userDao" />
</bean>
@Test
public void testUserService(){
// 加载Spring配置文件
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 获取Bean
UserService userService = classPathXmlApplicationContext.getBean("userService", UserService.class);
// 调用方法
userService.add();
}
add......
update to database .....
(1)一对多关系:部门和员工 一个部门有多个员工,一个员工属于一个部门 部门是一,员工是多
(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示
package com.dance.spring5;
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
package com.dance.spring5;
public class Emp {
private String ename;
private String gender;
private Dept dept;
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"ename='" + ename + '\'' +
", gender='" + gender + '\'' +
", dept=" + dept +
'}';
}
}
<bean id="emp" class="com.dance.spring5.Emp">
<property name="ename" value="flower" />
<property name="gender" value="男" />
<property name="dept">
<bean id="dept" class="com.dance.spring5.Dept">
<property name="dname" value="研发部" />
</bean>
</property>
</bean>
@Test
public void testEmp(){
// 加载Spring配置文件
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 获取Bean
Emp emp = classPathXmlApplicationContext.getBean("emp", Emp.class);
// 调用方法
System.out.println(emp);
}
Emp{ename='flower', gender='男', dept=Dept{dname='研发部'}}
<bean id="dept2" class="com.dance.spring5.Dept">
<property name="dname" value="研发部" />
</bean>
<bean id="emp2" class="com.dance.spring5.Emp">
<property name="ename" value="dance" />
<property name="gender" value="女" />
<property name="dept" ref="dept2" />
</bean>
emp类增加get方法
public Dept getDept() {
return dept;
}
<bean id="emp3" class="com.dance.spring5.Emp">
<property name="ename" value="dance" />
<property name="gender" value="女" />
<property name="dept" ref="dept2" />
<property name="dept.dname" value="财务部" />
</bean>
package com.dance.spring.learn.collection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Stu {
//1 数组类型属性
private String[] courses;
//2 list 集合类型属性
private List list;
//3 map 集合类型属性
private Map<String,String> maps;
//4 set 集合类型属性
private Set sets;
public void setSets(Set sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
@Override
public String toString() {
return "Stu{" +
"courses=" + Arrays.toString(courses) +
", list=" + list +
", maps=" + maps +
", sets=" + sets +
'}';
}
}
<bean id="stu" class="com.dance.spring.learn.collection.Stu">
<!-- 数组-->
<property name="courses">
<array>
<value>Java</value>
<value>Spring</value>
</array>
</property>
<!-- 集合-->
<property name="list">
<list>
<value>IOC</value>
<value>AOP</value>
</list>
</property>
<!-- Set-->
<property name="sets">
<set>
<value>Mysql</value>
<value>Oracle</value>
</set>
</property>
<!-- map-->
<property name="maps">
<map>
<entry key="name" value="flower" />
<entry key="age" value="21" />
</map>
</property>
</bean>
@Test
public void test1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
Stu stu = applicationContext.getBean("stu", Stu.class);
System.out.println(stu);
}
Stu{courses=[Java, Spring], list=[IOC, AOP], maps={name=flower, age=21}, sets=[Mysql, Oracle]}
package com.dance.spring.learn.collection;
/**
* 课程类
*/
public class Course {
private String cname;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
package com.dance.spring.learn.collection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Stu {
//1 数组类型属性
private String[] courses;
//2 list 集合类型属性
private List list;
//3 map 集合类型属性
private Map<String,String> maps;
//4 set 集合类型属性
private Set sets;
// 5 list 对象集合
private List courseList;
public void setCourseList(List courseList) {
this.courseList = courseList;
}
public void setSets(Set sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
@Override
public String toString() {
return "Stu{" +
"courses=" + Arrays.toString(courses) +
", list=" + list +
", maps=" + maps +
", sets=" + sets +
", courseList=" + courseList +
'}';
}
}
<!-- 创建多个Course-->
<bean id="cs1" class="com.dance.spring.learn.collection.Course">
<property name="cname" value="语文" />
</bean>
<bean id="cs2" class="com.dance.spring.learn.collection.Course">
<property name="cname" value="数学" />
</bean>
<bean id="stu" class="com.dance.spring.learn.collection.Stu">
<!-- 数组-->
<property name="courses">
<array>
<value>Java</value>
<value>Spring</value>
</array>
</property>
<!-- 集合-->
<property name="list">
<list>
<value>IOC</value>
<value>AOP</value>
</list>
</property>
<!-- Set-->
<property name="sets">
<set>
<value>Mysql</value>
<value>Oracle</value>
</set>
</property>
<!-- map-->
<property name="maps">
<map>
<entry key="name" value="flower" />
<entry key="age" value="21" />
</map>
</property>
<!-- list Object-->
<property name="courseList">
<list>
<ref bean="cs1" />
<ref bean="cs2" />
</list>
</property>
</bean>
使用之前的测试类
Stu{courses=[Java, Spring], list=[IOC, AOP], maps={name=flower, age=21}, sets=[Mysql, Oracle], courseList=[Course{cname='语文'}, Course{cname='数学'}]}
package com.dance.spring.learn.collection;
import java.util.List;
public class Book {
private List books;
public void setBooks(List books) {
this.books = books;
}
@Override
public String toString() {
return "Book{" +
"books=" + books +
'}';
}
}
增加命名空间
xmlns:util="http://www.springframework.org/schema/util"
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
配置bookList
<util:list id="bookList">
<value>Java</value>
<value>C++</value>
<value>Go</value>
</util:list>
<bean id="book" class="com.dance.spring.learn.collection.Book">
<property name="books" ref="bookList" />
</bean>
@Test
public void test2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
Book book = applicationContext.getBean("book", Book.class);
System.out.println(book);
}
Book{books=[Java, C++, Go]}
在配置文件中定义Bean的类型就是返回类型
package com.dance.spring.learn.factorybean;
public class MyBean {
public void speak(){
System.out.println("哈哈哈");
}
}
<bean id="myBean" class="com.dance.spring.learn.factorybean.MyBean" />
@Test
public void test3(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
MyBean myBean = applicationContext.getBean("myBean", MyBean.class);
myBean.speak();
}
哈哈哈
在配置文件定义Bean类型可以和返回类型不一致
实现FactoryBean接口,泛型为Course
实现接口里面的方法,在实现的方法中定义返回的 bean 类型
package com.dance.spring.learn.factorybean;
import com.dance.spring.learn.collection.Course;
import org.springframework.beans.factory.FactoryBean;
public class MyBean implements FactoryBean {
public void speak(){
System.out.println("哈哈哈");
}
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("JDOS实战");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
使用普通Bean的测试
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myBean' is expected to be of type 'com.dance.spring.learn.factorybean.MyBean' but was actually of type 'com.dance.spring.learn.collection.Course'
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:395)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1114)
at com.dance.spring.learn.testdemo.TestSpring5Demo.test3(TestSpring5Demo.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
显示类型错误
@Test
public void test3(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
Course myBean = applicationContext.getBean("myBean", Course.class);
System.out.println(myBean);
}
Course{cname='JDOS实战'}
去掉Book类的toString方法
package com.dance.spring.learn.collection;
import java.util.List;
public class Book {
private List books;
public void setBooks(List books) {
this.books = books;
}
}
新建单元测试
@Test
public void test4(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
Book book1 = applicationContext.getBean("book", Book.class);
Book book2 = applicationContext.getBean("book", Book.class);
System.out.println(book1);
System.out.println(book2);
}
com.dance.spring.learn.collection.Book@2a40cd94
com.dance.spring.learn.collection.Book@2a40cd94
通过执行结果可以看出,在Spring中Bean的作用域默认是单例的
其他的我记得还有
request和session
request:一次请求
session:一次会话
想详细了解的话可以看一下:https://blog.csdn.net/kongmin_123/article/details/82048392
我感觉写的很好,但是一般没啥用,一般使用的话都是单例的,也就是默认的,在SpringBoot中也都是单例使用的
修改为多实例对象
<bean id="book" class="com.dance.spring.learn.collection.Book" scope="prototype">
<property name="books" ref="bookList" />
</bean>
就是上面默认作用域的测试类
com.dance.spring.learn.collection.Book@2a40cd94
com.dance.spring.learn.collection.Book@f4168b8
通过结果可以看出,对象的内存地址不一样,所以是多实例对象
从对象创建到对象销毁的过程
package com.dance.spring.learn.factorybean;
public class Orders {
private String oname;
public Orders() {
System.out.println("生命周期调用链: 第一步");
}
public void setOname(String oname) {
this.oname = oname;
System.out.println("生命周期调用链: 第二步");
}
public void init(){
System.out.println("生命周期调用链: 第三步");
}
public void destroy(){
System.out.println("生命周期调用链: 第五步");
}
}
<bean id="orders" class="com.dance.spring.learn.factorybean.Orders" init-method="init" destroy-method="destroy">
<property name="oname" value="啊哈哈哈~" />
</bean>
@Test
public void test5(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
Orders orders = applicationContext.getBean("orders", Orders.class);
System.out.println("生命周期调用链: 第四步");
// 手动销毁容器
applicationContext.close();
}
生命周期调用链: 第一步
生命周期调用链: 第二步
生命周期调用链: 第三步
生命周期调用链: 第四步
生命周期调用链: 第五步
后置处理器的生命周期位于初始化第三步的前后,整合后就是7步
package com.dance.spring.learn.factorybean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("生命周期调用链: 第三步之前");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("生命周期调用链: 第三步之后");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
<bean id="myBeanPostProcessor" class="com.dance.spring.learn.factorybean.MyBeanPostProcessor" />
调用Bean的生命周期样例测试
生命周期调用链: 第一步
生命周期调用链: 第二步
生命周期调用链: 第三步之前
生命周期调用链: 第三步
生命周期调用链: 第三步之后
生命周期调用链: 第四步
生命周期调用链: 第五步
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
package com.dance.spring.learn.autowire;
public class Dept {
}
package com.dance.spring.learn.autowire;
public class Emp {
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"dept=" + dept +
'}';
}
}
<bean id="dept" class="com.dance.spring.learn.autowire.Dept" />
<bean id="emp" class="com.dance.spring.learn.autowire.Emp" autowire="byName">
</bean>
byName:根据名称自动注入
byType:根据类型自动注入
@Test
public void test6(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring2.xml");
Emp emp = applicationContext.getBean("emp", Emp.class);
System.out.println(emp);
}
Emp{dept=com.dance.spring.learn.autowire.Dept@25bbf683}
<bean id="dept" class="com.dance.spring.learn.autowire.Dept" />
<bean id="emp" class="com.dance.spring.learn.autowire.Emp" autowire="byType">
</bean>
使用test6进行测试
Emp{dept=com.dance.spring.learn.autowire.Dept@3578436e}
配置德鲁伊连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/userDb" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
在src下创建jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/userDb
jdbc.username=root
jdbc.password=123456
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driver" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
上面四个注解的功能是一样的,都可用来创建Bean实例
<!--
开启组件扫描
多包配置可以使用逗号隔开,也可以写父包
-->
<context:component-scan base-package="com.dance.spring.learn.service" />
@Service
public class UserService {
public void add(){
System.out.println("add ......");
}
}
@Test
public void test7(){
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("Spring3-annotation.xml");
UserService userService = classPathXmlApplicationContext.getBean("userService", UserService.class);
userService.add();
}
add ......
<!--
只扫描@Controller
use-default-filters="false" : 不使用默认的扫描过滤器
context:include-filter: 包含过滤器
type="annotation": 类型为注解
expression="org.springframework.stereotype.Controller": 只扫描@Controller
-->
<context:component-scan base-package="com.dance.spring.learn.service" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
不扫描@Controller
context:exclude-filter: 排除过滤器
type="annotation": 类型为注解
expression="org.springframework.stereotype.Controller": 不扫描@Controller
-->
<context:component-scan base-package="com.dance.spring.learn.service">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
根据类型进行自动装配
package com.dance.spring.learn.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void add(){
System.out.println("add to db.....");
}
}
package com.dance.spring.learn.service;
import com.dance.spring.learn.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
public UserDao userDao;
public void add(){
System.out.println("add ......");
userDao.add();
}
}
因为之前的已经配置了很多的配置,所以在Src下新建Spring4.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:util="http://www.springframework.org/schema/util"
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/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 扫描父包 learn -->
<context:component-scan base-package="com.dance.spring.learn"/>
</beans>
@Test
public void test8(){
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("Spring4.xml");
UserService userService = classPathXmlApplicationContext.getBean("userService", UserService.class);
userService.add();
}
add ......
add to db.....
需要配合Autowired一期使用,默认为根据类型自动装配,添加@Qualifier后将根据Qualifier的value值进行按名称自动装配
package com.dance.spring.learn.service;
import com.dance.spring.learn.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
@Qualifier(value = "userDao")
public UserDao userDao;
public void add(){
System.out.println("add ......");
userDao.add();
}
}
使用test8进行测试
add ......
add to db.....
既可以使用类型注入也可以使用名称注入,默认为名称注入,如果没有相同的名称那么就按类型注入,name和type都指定时,取都符合条件的
package com.dance.spring.learn.service;
import com.dance.spring.learn.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserService {
// @Autowired
// @Qualifier(value = "userDao")
// public UserDao userDao;
@Resource
public UserDao userDao;
public void add(){
System.out.println("add ......");
userDao.add();
}
}
使用test8进行测试
add ......
add to db.....
用于对普通值进行注入,也可以配合上面的外部属性文件采用${}方式获取配置文件值
package com.dance.spring.learn.service;
import com.dance.spring.learn.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserService {
// @Autowired
// @Qualifier(value = "userDao")
// public UserDao userDao;
@Resource
public UserDao userDao;
@Value(value = "flower")
public String name;
public void add(){
System.out.println("add ......:"+name);
userDao.add();
}
}
使用test8进行测试
add ......:flower
add to db.....
package com.dance.spring.learn.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"com.dance.spring.learn"})
public class SpringConfig {
}
@Test
public void test9(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = annotationConfigApplicationContext.getBean("userService", UserService.class);
userService.add();
}
add ......:flower
add to db.....