spring之xml管理bean(回字有几种写法)

3.介绍Bean在spring容器中的管理方式(xml) 手动装配

xml的方法太过于低效,感觉意义不大,了解一下就可以了,重要的是注解开发

​ 第一步我们写好一个user类

public class User
{public void add(){System.out.println("我加了");}}

​ 然后我们在src包下 写xml文件 bean1.xml


<bean id="user" class="com.xyq.spring_1.User">bean>

并且写一个测试类

 @Testpublic void testAdd(){//1.加载spring配置文件
//            这个函数和类就用到了spring框架
//        IOC两大接口 1. BeanFactory   2. ApplicationcontextApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");//        2.获取配置 创建文件User user = context.getBean("user", User.class);System.out.println(user);user.add();}

​ 我们可以发现context的引用方式可以有1. BeanFactory 2. Applicationcontext两种,并且我们要注意好xml文件的地址

​ 这个也是spring管理bean的基本流程

① 使用set 来给bean赋值

有如下Book类

public class Book {private String bname;private String author;private String address;public void setBname(String bname) {this.bname = bname;}public void setAuthor(String author) {this.author = author;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Book{" +"bname='" + bname + '\'' +", author='" + author + '\'' +"address" +" " +address+'}';}public String getBname() {return bname;}public String getAuthor() {return author;}}

xml 文件

<property name="author" value="xyq">property><property name="bname" value="wdnmd">property><property name="address" ><value> >]]>value>property>bean>

测试类

@Testpublic void test2(){//1.加载spring配置文件
//            这个函数和类就用到了spring框架
//        IOC两大接口 1. BeanFactory   2. ApplicationcontextApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");//        2.获取配置 创建文件Book book = context.getBean("book", Book.class);System.out.println(book);}

即 用 property 来赋值 并且要有对应的set方法,并且要获取得到其引用

② 使用 有参构造方法 赋值bean

有一下order类

public class Order {private String oName;private String oFee;public Order(String oName, String oFee) {this.oName = oName;this.oFee = oFee;}@Overridepublic String toString() {return "Order{" +"oName='" + oName + '\'' +", oFee='" + oFee + '\'' +'}';}
}

注意该类的无参构造方法已被覆盖

所以xml文件编写的方式也不大一样

xml文件

<constructor-arg name="oName" value="ojk">constructor-arg><constructor-arg name="oFee" value="osjk">constructor-arg>bean>

测试类

@Test
public void test3(){ApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");Order order = context.getBean("order", Order.class);System.out.println(order);
}

可以注意到不过是标签有区别而已

③ 使用P命名空间来给bean赋值

我们依然用到Book类

如下

public class Book {private String bname;private String author;private String address;public void setBname(String bname) {this.bname = bname;}public void setAuthor(String author) {this.author = author;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Book{" +"bname='" + bname + '\'' +", author='" + author + '\'' +"address" +" " +address+'}';}public String getBname() {return bname;}public String getAuthor() {return author;}}

xml的命名头(应该叫协议吧)有点区别


<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

我们添加了其中的

xmlns:p=“http://www.springframework.org/schema/p”

是由上列的xsi改的

然后


bean>

xml只要这样写就方便了很多了

这边给出测试类

@Test
public void test4(){ApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");Book book1 = context.getBean("book1", Book.class);System.out.println(book1);}
④ 注入空值和特殊符号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZ3VthrX-1606220314639)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201121233111104.png)]

如图 不过是加一个null标签

特殊符号:1.查找对应的转义符号

比如< 对应 <之类的

2.写进cData标签内

<property name="address" ><value> <![CDATA[<<南京>>]]></value>
</property>
⑤ 注入外部bean

以如下结构建立文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McB007x3-1606220314644)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201121233459045.png)]

下面给出对应文件代码

UserDao

public interface UserDao {public void update();
}

UserDaoImpl

public class UserDaoImpl implements  UserDao {public void update(){System.out.println("Dao updated too");}
}

UserService

public class UserService {//    创建userDao类型属性, 生产set方法private  UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public  void add(){System.out.println("I am created");//原始方式
//        UserDao userDao =new UserDaoImpl();
//        userDao.update();//2userDao.update();}}

xml

<bean id="userService" class="com.xyq.spring_1.service.UserService"><property name="userDao" ref="userDaoImp">property>bean><bean id="userDaoImp" class="com.xyq.spring_1.dao.UserDaoImpl">bean>

测试类

@Test
public void testAdd(){ApplicationContext context =new ClassPathXmlApplicationContext("bean2.xml");UserService userService = context.getBean("userService", UserService.class);userService.add();
}

这样就可以注入外部bean了

⑥ 内部bean

如下结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqcS02AW-1606220314646)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201121233841196.png)]

Dept

public class Dept {private  String dName;public void setdName(String dName) {this.dName = dName;}@Overridepublic String toString() {return "Dept{" +"dName='" + dName + '\'' +'}';}
}

emp

public class Emp {private String eName;private String gender;private  Dept dept;public void setDept(Dept dept) {this.dept = dept;}public Dept getDept() {return dept;}public void seteName(String eName) {this.eName = eName;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Emp{" +"eName='" + eName + '\'' +", gender='" + gender + '\'' +", dept=" + dept +'}';}
}

xml类

<bean id="emp" class="com.xyq.spring_1.Bean.Emp"><property name="eName" value="wsz">property><property name="gender" value="">property><property name="dept" ><bean id="dept" class="com.xyq.spring_1.Bean.Dept"><property name="dName" value="保安保护不了任何人">property>bean>property>bean>

测试类

@Test
public void testInnerBean(){ApplicationContext context =new ClassPathXmlApplicationContext("bean3.xml");Emp emp = context.getBean("emp", Emp.class);System.out.println(emp);
}
⑦级联赋值

类依旧使用dept和emp类

xml


<bean id="emp" class="com.xyq.spring_1.Bean.Emp"><property name="eName" value="wsz">property><property name="gender" value="">property><property name="dept" ref="dept">property><property name="dept.dName" value="技术部">property>
bean><bean id="dept" class="com.xyq.spring_1.Bean.Dept">
bean>

我们可以看出,使用ref来连接外部bean 后

有两种方式对级联 低级bean 的属性赋值

一种在低级bean中使用 property标签

另一种在高级bean中直接

但是前提是emp类可以获取到dept对象

⑧ 给bean附集合,数组属性

有stu类

public class Stu {private String[] subjct;private List<String> list;private List<Course> course;private Map<String, String> maps;private Set<String> set;public Stu() {}public void setSet(Set<String> set) {this.set = set;}public void setList(List<String> list) {this.list = list;}public void setCourse(List<Course> course) {this.course = course;}public void setMaps(Map<String, String> maps) {this.maps = maps;}public void setSubjct(String[] subjct) {this.subjct = subjct;}public String toString() {return "Stu{subjct=" + Arrays.toString(this.subjct) + ", list=" + this.list + ", course=" + this.course + ", maps=" + this.maps + ", set=" + this.set + '}';}
}

course类

public class Course {private String cName;public Course() {}public void setcName(String cName) {this.cName = cName;}public String toString() {return "Course{cName='" + this.cName + '\'' + '}';}
}

book类

public class Book {private List<String> list;public Book() {}public void setList(List<String> list) {this.list = list;}public String toString() {return "Book{list=" + this.list + '}';}
}
<bean id="stu" class="com.xyq.spring_1.TestDemo.collectionBean.Stu"><property name="subjct" ><array><value>mysqlvalue><value>javavalue>array>property><property name="list"><list><value>长大value><value>变小value>list>property><property name="maps"><map><entry key="刘德华" value="无间道">entry><entry key="陈建仁" value="无间地狱">entry>map>property><property name="set"><set><value>okokovalue><value>ditjgjvalue>set>property><property name="course"><list><ref bean="course1">ref><ref bean="course2">ref>list>property>bean><bean id="course1" class="com.xyq.spring_1.TestDemo.collectionBean.Course"><property name="cName" value="iygf">property>
bean>
<bean id="course2" class="com.xyq.spring_1.TestDemo.collectionBean.Course"><property name="cName" value="ddhgf">property>
bean>

我们可以发现bean中的集合 可以赋值基本属性,也可以赋值对象,区别是基本属性用value ,对象则需要在外部创建,并且用ref引用

测试类

@Test
public void testAdd() {ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Stu stu = (Stu)context.getBean("stu", Stu.class);System.out.println(stu);
}@Test
public void test01() {ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Book book = (Book)context.getBean("book", Book.class);System.out.println(book);
}
⑨ 提取公共bean

我们如果不想重复创建bean 想要单纯地提取出bean,然后多次引用就需要在协议 声明中 写上util的声明


<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd       "><util:list id="bookList"><value>sdvalue><value>ddddvalue>util:list><bean id="book" class="com.xyq.spring_1.TestDemo.collectionBean.Book"><property name="list" ref="bookList">property>bean>beans>

我们可以发现util的声明其实是

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

将其beans都改成util既可以

⑩ 工厂bean

可以分出两种bean 一种是基本bean ,另一种是实现了FactoryBean<>接口的工厂bean

工厂bean有getObject() getObjectType() isSingleton() 三个抽象实现方法

意味着可以在工厂bean写上反射机制或者new来返回其他类 的bean (不是工厂类的bean)

有myBean类

public class myBean implements FactoryBean<Course> {public myBean() {}public Course getObject() throws Exception {Course course = new Course();course.setcName("dsadas");return course;}public Class<?> getObjectType() {return Course.class;}public boolean isSingleton() {return false;}
}

xml文件


@Test
public void test02() {ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Course course = (Course)context.getBean("myBean", Course.class);System.out.println(course);
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部