1、Spring是一个分层的J2EE/2SE一站式的开源框架
1)降低了耦合度,
2)允许使用者选择框架
3)分层一站式:为每层的开发都提供了解决方法。
4)对目前流行的框架都进行支持
2、Spring的核心是IOC(控制反转)【DI】和AOP容器框架
一、IOC容器
IOC:控制反转。控制权反转给spring。
之前对象的创建是由程序员完成的,用了spring之后,对象的创建教给了spring容器。spring可以帮助我们管理bean对象。
IOC思想基于ioc容器完成,IOC容器底层就是对象工厂
1、将Spring交给Bean管理
【id是bean下的类名,bean会自动起别名,将首字母小写】
【class是id所在的位置】
<bean id="users" class="com.openlab.beans.Users"></bean>
spring对bean的管理——控制反转
——结果相同,说明Spring对bean的管理是单例模式
@Test
public void test02(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Object obj = applicationContext.getBean("users");
System.out.println(obj);
Users users = applicationContext.getBean("users",Users.class);
System.out.println(users);
Users users01 = applicationContext.getBean(Users.class);//通过类型获取,要求spring容器中只能有唯一的改类型的bean对象
System.out.println(users01);
}
对同一个类创建不同的bean,获取到的是不同的bean
<bean id="users" class="com.openlab.beans.Users"></bean>
<bean id="users01" class="com.openlab.beans.Users"></bean>
Users users = applicationContext.getBean("users",Users.class);//通过类名拿
System.out.println(users);
Users users01 = applicationContext.getBean("users01",Users.class);//通过类名拿
System.out.println(users01);
允许无参构造运行
@NoArgsConstructor//加入之后有无参构造的方法可以运行
2、spring给对象的属性赋值
1)set注入:直接调用set方法
<bean id="users" class="com.openlab.beans.Users">
<property name="userName" value="admin"></property>
<property name="status" value="status"></property>
<property name="password" value="password"></property>
</bean>
2)构造子注入:
public Users(String userName,String password){
this.userName = userName;
this.password = password;
}
【如果不加name,必须按照顺序来写】
<bean id="users01" class="com.openlab.beans.Users">
<constructor_arg name="userName" value="test"></constructor_arg>
<constructor_arg name="password" value="admin123456"></constructor_arg>
</bean>
属性的值如果是容器中另一个Bean的实例,应该使用ref
<property name="userInfo" value="userinnfo"></property>
<bean id="userinfo" class="com.openlab.beans.UserInfo">
<property name="realname" value="张三丰"></property>
<property name="address" value="武当"></property>
<property name="idcard" value="1234565"></property>
<property name="phone" value="12234"></property>
</bean>
3)属性的DI:依赖注入
DI:依赖注入,service依赖dao.将dao的创建给了spring容器。
@Getter
@Setter
public class UsersServiceImpl {
private UsersDao usersDao ;
public void save(){
Users users = new Users();
usersDao.save(users);
System.out.println("---service中的添加方法---");
}
}
<bean id="userDaoImpl1" class="com.openlab.dao.impl.UsersDaoImpl"></bean>
<bean id="userDaoImpl2" class="com.openlab.dao.impl.UsersDaoImpl2"></bean>
<bean id="userService" class="com.openlab.service.UsersServiceImpl">
<property name="usersDao" ref="userDaoImpl2"></property>
</bean>
/*如果值中包含特殊字符,使用<![CDATA[内容]]>*/
3、内部bean
内部bean的定义,使用只能再给emp3中的dept属性赋值
可以给id属性赋值,该bean再其他的地方也是不能使用的
【内部bean只使用一次,可以不写id】
<bean id="emp2" class="com.openlab.beans.Emp">
<property name="empid" value="1003"></property>
<property name="empname" value="juddy"></property>
<property name="dept">
<bean class="com.openlab.beans.Dept" id="dept">
<property name="deptname" value="测试部"></property>
</bean>
</property>
</bean>
4、bean工厂
在配置文件中定义的bean类型可以和返回类型不一样
<bean id="myFactoryBean" class="com.openlab.beans.MyFactoryBean"></bean>
public class MyFactoryBean implements FactoryBean<Emp> {
@Override
public Emp getObject() throws Exception {
Emp emp = new Emp();
emp.setEmpid(1001);
emp.setEmpname("工厂bean创建的bean");
return emp;
}
@Override
public Class<?> getObjectType() {
return Emp.class;
}
}
5、作用域
prototype:非单例模式
prototype:单例模式 默认值
6、Bean的生命周期
1>构造
2>set
3>初始化方法之前
4>初始化方法
5>初始化方法之后
6>bean可以正常使用
7>销毁
7、注解
1)@Component【普通的java类】
2)@Repository/【持久层,dao层】
3)@Service 【业务层 service层】
4)@Controller 【控制层 servlet,mvc】
1、加入扫描的基准包
<context:component-scan base-package="com.openlab"/>
加入注解 ,表示已经被spring管理
@Getter
@Setter
@Component
public class Users {
private Integer userid;
private String username;
private String password;
}
2、完全注解
@Configuration
@ComponentScan(value = {"com.openlab"})
public class SpringConfiger {
}
@Test
public void test01(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiger.class);
UsersAction usersAction = context.getBean(UsersAction.class);
usersAction.save();
}