导入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> <scope>provided</scope> </dependency> 实体类 @Data @NoArgsConstructor @AllArgsConstructor public class User { private String name; private String sex; private Integer age; } @Data @NoArgsConstructor @AllArgsConstructor public class People { private String name; private String sex; private Properties properties; private List<String> hobbies; } @Data @NoArgsConstructor @AllArgsConstructor public class Work { private String station; private double salary; private Map<String, People> peoples; } public class UserDao { public void save(){ System.out.println("Success"); }; } public class UserServiceImpl implements UserService { private UserDao dao; public UserServiceImpl() { } public UserServiceImpl(UserDao funDao) { this.dao = funDao; } // //set方法注入 // public void setUserDao(UserDao dao) { // this.dao = dao; // } @Override public void init() { System.out.println("初始化方法"); } @Override public void save() { dao.save(); } @Override public void destroy() { System.out.println("销毁方法"); } } 配置文件内容 text.properties msg=HelloWorld day=2022.8.22
xml配置文件内容
<!--读配置文件 读取text.properties的内容--> <bean id="propertiesMsg" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:text.properties</value> </list> </property> </bean> 在容器中生成People实体,id是唯一标识class是实体的路径 <bean id="p" class="com.init.model.People"> property是对类属性的设置,value是表示基础类型的值设定 <property name="name" value="卡沙"/> <property name="sex" value="女"/> list是对集合的赋值 <property name="hobbies"> <list> <value>打游戏</value> <value>听歌</value> <value>跑步</value> </list> </property> properties是引用类型,数据格式是a=1,所以设置时格式如下 <property name="properties"> <props> ${day}读取配置文件后采用这个格式获取值,day是key <prop key="msg">${day}</prop> </props> </property> </bean> <bean id="p2" class="com.init.model.People"> <property name="name" value="卡沙"/> <property name="sex" value="女"/> <property name="hobbies"> <list> <value>看定影</value> <value>听歌</value> <value>打篮球</value> </list> </property> <property name="properties"> <props> <prop key="msg">${msg}</prop> </props> </property> </bean> <bean id="worker" class="com.init.model.Work"> <property name="salary" value="#{3661.55}"/> <property name="station" value="前端"/> <property name="peoples"> 因为map是引用类型 <map> 且泛型规定了值必须是People类型数据,这里使用得ref因为People是引用类型数据 <entry key="p1" value-ref="p"/> <entry key="p2" value-ref="p2"/> </map> </property> </bean> 测试 @org.junit.Test public void testWorker(){ ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Work work = (Work) context.getBean("worker"); System.out.println(work); }
接下来是当一个中属性是引用类型的案例
<!--有参构造方法注入--> <bean id="userDao" class="com.init.dao.UserDao"/> <bean id="userService" class="com.init.service.impl.UserServiceImpl"> <constructor-arg name="funDao" ref="userDao"/> </bean>
<!--set方法注入--> <bean id="userDao" class="com.init.dao.UserDao"></bean> <bean id="userService" class="com.init.service.impl.UserServiceImpl"> <!--name的值:set方法的后半截,首字母小写--> <property name="userDao" ref="userDao"/> </bean>
这两个的区别一个利用set方法给属性赋值,一个是利用构造方法赋值区别不大.看个人喜欢,这个ioc思想其实归根就是反射,由容器跟我们创建对象,不在像以前那样什么对象都需要自己去new,我们现在只需做的就是写bean标签然后给属性赋值.其中创建bean时候可以跟一些属性比如 <bean id="userService" class="com.init.service.impl.UserServiceImpl" scope="singleton" init-method="init" destroy-method="destroy"/>
scope="singleton"代表是创建一个单例对象,默认.可以设置的值有prototype、request、session、global session。session和global session类型只实用于 web程序,通常是和XmlWebApplicationContext共同使用。prototype和单例相反。init-method和destroy-method是自动调用的方法你可以加入一些自己想要的设置,这个方法必须要有我的UserServiceImpl里有是有的.